From 59ce2c32277b09b1b320827631cde70cfa94a552 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 19 Aug 2010 01:11:10 +0100 Subject: [PATCH] remove ancient and unused OpenSim.GridLaunch GUI code. Current policy is that OpenSim core is not the place for gui tools --- OpenSim/Tools/OpenSim.GridLaunch/App.config | 40 - .../Tools/OpenSim.GridLaunch/AppExecutor.cs | 247 ----- .../OpenSim.GridLaunch/AppExecutor_AsyncIO.cs | 85 -- .../OpenSim.GridLaunch/AppExecutor_Thread.cs | 187 ---- .../OpenSim.GridLaunch/CommandProcessor.cs | 76 -- .../OpenSim.GridLaunch/GUI/Console/Console.cs | 122 --- OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs | 39 - .../OpenSim.GridLaunch/GUI/Network/Client.cs | 113 --- .../OpenSim.GridLaunch/GUI/Network/TCPD.cs | 231 ----- .../OpenSim.GridLaunch/GUI/Service/Service.cs | 65 -- .../GUI/WinForm/OpenSim Bottom Border.png | Bin 163 -> 0 bytes .../GUI/WinForm/OpenSim Right Border.png | Bin 545 -> 0 bytes .../GUI/WinForm/OpenSim.png | Bin 44406 -> 0 bytes .../GUI/WinForm/ProcessPanel.Designer.cs | 224 ----- .../GUI/WinForm/ProcessPanel.cs | 288 ------ .../GUI/WinForm/ProcessPanel.resx | 882 ------------------ .../GUI/WinForm/ucAppWindow.Designer.cs | 72 -- .../GUI/WinForm/ucAppWindow.cs | 63 -- .../GUI/WinForm/ucAppWindow.resx | 120 --- .../GUI/WinForm/ucInputField.Designer.cs | 77 -- .../GUI/WinForm/ucInputField.cs | 97 -- .../GUI/WinForm/ucInputField.resx | 120 --- .../GUI/WinForm/ucLogWindow.Designer.cs | 62 -- .../GUI/WinForm/ucLogWindow.cs | 80 -- .../GUI/WinForm/ucLogWindow.resx | 120 --- .../OpenSim.GridLaunch.csproj | 126 --- .../OpenSim.GridLaunch/OpenSim.GridLaunch.ini | 3 - .../OpenSim.GridLaunch/OpenSim.GridLaunch.sln | 20 - OpenSim/Tools/OpenSim.GridLaunch/Program.cs | 245 ----- .../Properties/AssemblyInfo.cs | 63 -- .../Properties/Resources.Designer.cs | 84 -- .../Properties/Resources.resx | 130 --- OpenSim/Tools/OpenSim.GridLaunch/Settings.cs | 181 ---- .../OpenSim.GridLaunch/log4netAppender.cs | 65 -- 34 files changed, 4327 deletions(-) delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/App.config delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Bottom Border.png delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim.png delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.Designer.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.Designer.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.Designer.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.sln delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/Program.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.Designer.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/Settings.cs delete mode 100644 OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs diff --git a/OpenSim/Tools/OpenSim.GridLaunch/App.config b/OpenSim/Tools/OpenSim.GridLaunch/App.config deleted file mode 100644 index 1e53319b3b..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/App.config +++ /dev/null @@ -1,40 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs deleted file mode 100644 index 638956ee9c..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Text; -using System.Threading; -using log4net; - -namespace OpenSim.GridLaunch -{ - internal partial class AppExecutor : IDisposable - { - // How long to wait for process to shut down by itself - private static readonly int shutdownWaitSeconds = 10; - - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - //private StreamWriter Input { get { return process.StandardInput; } } - //private StreamReader Output { get { return process.StandardOutput; } } - //private StreamReader Error { get { return process.StandardError; } } - - private StreamWriter Input { get; set; } - private StreamReader Output { get; set; } - private StreamReader Error { get; set; } - - private object processLock = new object(); - - private bool isRunning = false; - public bool IsRunning { get { return isRunning; } } - - private string file; - public string File { get { return file; } } - - Process process; - - public AppExecutor(string File) - { - file = File; - } - - #region Dispose of unmanaged resources - ~AppExecutor() - { - Dispose(); - } - private bool isDisposed = false; - public void Dispose() - { - if (!isDisposed) - { - isDisposed = true; - Stop(); - } - } - #endregion - - #region Start / Stop process - public void Start() - { - if (isDisposed) - throw new ApplicationException("Attempt to start process in Disposed instance of AppExecutor."); - // Stop before starting - Stop(); - - lock (processLock) - { - isRunning = true; - - m_log.InfoFormat("Starting \"{0}\".", file); - - // Start the process - process = new Process(); - process.StartInfo.FileName = file; - process.StartInfo.Arguments = ""; - process.StartInfo.CreateNoWindow = true; - process.StartInfo.UseShellExecute = false; - process.StartInfo.ErrorDialog = false; - process.EnableRaisingEvents = true; - - - // Redirect all standard input/output/errors - process.StartInfo.RedirectStandardInput = true; - process.StartInfo.RedirectStandardOutput = true; - process.StartInfo.RedirectStandardError = true; - - // Start process - process.Start(); - - Input = process.StandardInput; - Output = process.StandardOutput; - Error = process.StandardError; - - // Start data copying - timer_Start(); - - // We will flush manually - //Input.AutoFlush = false; - - } - } - - public void Stop() - { - // Shut down process - // We will ignore some exceptions here, against good programming practice... :) - - lock (processLock) - { - // Running? - if (!isRunning) - return; - isRunning = false; - - timer_Stop(); - - m_log.InfoFormat("Stopping \"{0}\".", file); - - // Send exit command to console - try - { - if (Input != null) - { - _writeLine(""); - _writeLine("exit"); - _writeLine("quit"); - // Wait for process to exit - process.WaitForExit(1000 * shutdownWaitSeconds); - } - } - catch (Exception ex) - { - m_log.ErrorFormat("Exeption asking \"{0}\" to shut down: {1}", file, ex.ToString()); - } - - try - { - // Forcefully kill it - if (process.HasExited != true) - process.Kill(); - } - catch (Exception ex) - { - m_log.ErrorFormat("Exeption killing \"{0}\": {1}", file, ex.ToString()); - } - - try - { - // Free resources - process.Close(); - } - catch (Exception ex) - { - m_log.ErrorFormat("Exeption freeing resources for \"{0}\": {1}", file, ex.ToString()); - } - - // Dispose of stream and process object - //SafeDisposeOf(Input); - //SafeDisposeOf(Output); - //SafeDisposeOf(Error); - Program.SafeDisposeOf(process); - } - - // Done stopping process - } - - #endregion - - #region Write to stdInput - public void Write(string Text) - { - // Lock so process won't shut down while we write, and that we won't write while proc is shutting down - lock (processLock) - { - _write(Text); - } - } - public void _write(string Text) - { - if (Input != null) - { - try - { - Input.Write(Text); - Input.Flush(); - } - catch (Exception ex) - { - m_log.ErrorFormat("Exeption sending text \"{0}\" to \"{1}\": {2}", file, Text, ex.ToString()); - } - - } - } - public void WriteLine(string Text) - { - // Lock so process won't shut down while we write, and that we won't write while proc is shutting down - lock (processLock) - { - _writeLine(Text); - } - } - public void _writeLine(string Text) - { - if (Input != null) - { - try - { - m_log.DebugFormat("\"{0}\": Sending: \"{1}\"", file, Text); - Input.WriteLine(Text); - Input.Flush(); - } - catch (Exception ex) - { - m_log.ErrorFormat("Exeption sending text \"{0}\" to \"{1}\": {2}", file, Text, ex.ToString()); - } - } - } - #endregion - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs deleted file mode 100644 index 8daef1b1ba..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace OpenSim.GridLaunch -{ - internal partial class AppExecutor - { - - - #region Start / Stop timer thread - private void timer_Start() - { - asyncReadOutput(); - asyncReadError(); - } - - private bool running = true; - private void timer_Stop() - { - running = false; - } - #endregion - - private byte[] readBufferOutput = new byte[4096]; - private byte[] readBufferError = new byte[4096]; - - private void asyncReadOutput() - { - if (running) - Output.BaseStream.BeginRead(readBufferOutput, 0, readBufferOutput.Length, asyncReadCallBackOutput, null); - } - private void asyncReadError() - { - if (running) - Error.BaseStream.BeginRead(readBufferError, 0, readBufferError.Length, asyncReadCallBackError, null); - } - - private void asyncReadCallBackOutput(IAsyncResult ar) - { - int len = Output.BaseStream.EndRead(ar); - Program.FireAppConsoleOutput(file, - System.Text.Encoding.ASCII.GetString(readBufferOutput, 0, len) - ); - - asyncReadOutput(); - } - private void asyncReadCallBackError(IAsyncResult ar) - { - int len = Error.BaseStream.EndRead(ar); - Program.FireAppConsoleError(file, - System.Text.Encoding.ASCII.GetString(readBufferError, 0, len) - ); - - asyncReadError(); - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs deleted file mode 100644 index f395aa4c66..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -//using System; -//using System.Collections; -//using System.Collections.Generic; -//using System.Reflection; -//using System.Text; -//using System.Threading; -//using log4net; - -//namespace OpenSim.GridLaunch -//{ -// internal class AppExecutor2 -// { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); -// private static readonly int consoleReadIntervalMilliseconds = 50; -// //private static readonly Timer readTimer = new Timer(readConsole, null, Timeout.Infinite, Timeout.Infinite); -// private static Thread timerThread; -// private static object timerThreadLock = new object(); - -// #region Start / Stop timer thread -// private static void timer_Start() -// { -// //readTimer.Change(0, consoleReadIntervalMilliseconds); -// lock (timerThreadLock) -// { -// if (timerThread == null) -// { -// m_log.Debug("Starting timer thread."); -// timerThread = new Thread(timerThreadLoop); -// timerThread.Name = "StdOutputStdErrorReadThread"; -// timerThread.IsBackground = true; -// timerThread.Start(); -// } -// } -// } -// private static void timer_Stop() -// { -// //readTimer.Change(Timeout.Infinite, Timeout.Infinite); -// lock (timerThreadLock) -// { -// if (timerThread != null) -// { -// m_log.Debug("Stopping timer thread."); -// try -// { -// if (timerThread.IsAlive) -// timerThread.Abort(); -// timerThread.Join(2000); -// timerThread = null; -// } -// catch (Exception ex) -// { -// m_log.Error("Exception stopping timer thread: " + ex.ToString()); -// } -// } -// } -// } -// #endregion - -// #region Timer read from consoles and fire event - -// private static void timerThreadLoop() -// { -// try -// { -// while (true) -// { -// readConsole(); -// Thread.Sleep(consoleReadIntervalMilliseconds); -// } -// } -// catch (ThreadAbortException) { } // Expected on thread shutdown -// } - -// private static void readConsole() -// { -// try -// { - -// // Lock so we don't collide with any startup or shutdown -// lock (Program.AppList) -// { -// foreach (AppExecutor app in new ArrayList(Program.AppList.Values)) -// { -// try -// { -// string txt = app.GetStdOutput(); -// // Fire event with received text -// if (!string.IsNullOrEmpty(txt)) -// Program.FireAppConsoleOutput(app.File, txt); -// } -// catch (Exception ex) -// { -// m_log.ErrorFormat("Exception reading standard output from \"{0}\": {1}", app.File, ex.ToString()); -// } -// try -// { -// string txt = app.GetStdError(); -// // Fire event with received text -// if (!string.IsNullOrEmpty(txt)) -// Program.FireAppConsoleOutput(app.File, txt); -// } -// catch (Exception ex) -// { -// m_log.ErrorFormat("Exception reading standard error from \"{0}\": {1}", app.File, ex.ToString()); -// } -// } -// } -// } -// finally -// { -// } -// } -// #endregion - - -// #region Read stdOutput and stdError -// public string GetStdOutput() -// { -// return GetStreamData(Output); -// } -// public string GetStdError() -// { -// return GetStreamData(Error); -// } - -// private static int num = 0; -// // Gets any data from StreamReader object, non-blocking -// private static string GetStreamData(StreamReader sr) -// { -// // Can't read? -// if (!sr.BaseStream.CanRead) -// return ""; - -// // Read a chunk -// //sr.BaseStream.ReadTimeout = 100; -// byte[] buffer = new byte[4096]; -// num++; -// Trace.WriteLine("Start read " + num); -// int len = sr.BaseStream.Read(buffer, 0, buffer.Length); -// Trace.WriteLine("End read " + num + ": " + len); - -// // Nothing? -// if (len <= 0) -// return ""; - -// // Return data -// StringBuilder sb = new StringBuilder(); -// sb.Append(System.Text.Encoding.ASCII.GetString(buffer, 0, len)); - -// //while (sr.Peek() >= 0) -// //{ -// // sb.Append(Convert.ToChar(sr.Read())); -// //} - -// return sb.ToString(); -// } -// #endregion - - -// } -//} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs b/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs deleted file mode 100644 index 77c50630bc..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.GridLaunch -{ - internal class CommandProcessor - { - public delegate void CommandLineDelegate(string application, string command, string arguments); - public event CommandLineDelegate CommandLine; - - public bool IsCommand(string cmd) - { - if (cmd.Trim().StartsWith("/")) - return true; - return false; - } - - public static readonly char[] cmdSplit = new char[] { ' ' }; - public bool Process(string app, string command) - { - // Only process commands - if (!IsCommand(command)) - return false; - - // Remove first / - command = command.Trim().Remove(0, 1); - - // Split cmd and args - string[] carg = command.Split(cmdSplit, 2); - if (carg.Length == 0) - return true; - - string cmd = carg[0]; // Command - string arg = ""; - if (carg.Length > 1) - arg = carg[1]; // Arguments - - // Do we have a command? - if (string.IsNullOrEmpty(cmd)) - return true; - - // All is fine - if (CommandLine != null) - CommandLine(app, cmd, arg); - return true; - } - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs deleted file mode 100644 index 596b6506f2..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.GridLaunch.GUI.Console -{ - internal class Console: IGUI - { - private List Apps = new List(); - public Console () - { - Program.AppCreated += Program_AppCreated; - Program.AppRemoved += Program_AppRemoved; - Program.AppConsoleOutput += Program_AppConsoleOutput; - Program.Command.CommandLine += Command_CommandLine; - } - - private string currentApp = ""; - private bool quitTyped = false; - void Command_CommandLine(string application, string command, string arguments) - { - - // If command is a number then someone might be trying to change console: /1, /2, etc. - int currentAppNum = 0; - if (int.TryParse(command, out currentAppNum)) - if (currentAppNum <= Apps.Count) - { - currentApp = Apps[currentAppNum - 1]; - System.Console.WriteLine("Changed console to app: " + currentApp); - } else - System.Console.WriteLine("Unable to change to app number: " + currentAppNum); - - // Has user typed quit? - if (command.ToLower() == "quit") - quitTyped = true; - - // Has user typed /list? - if (command.ToLower() == "list") - { - System.Console.WriteLine("/0 Log console"); - for (int i = 1; i <= Apps.Count; i++) - { - System.Console.WriteLine(string.Format("/{0} {1}", i, Apps[i - 1])); - } - } - } - #region Module Start / Stop - public void StartGUI() - { - // Console start - System.Console.WriteLine("Console GUI"); - System.Console.WriteLine("Use commands /0, /1, /2, etc to switch between applications."); - System.Console.WriteLine("Type /list for list of applications."); - System.Console.WriteLine("Anything that doesn't start with a / will be sent to selected application"); - System.Console.WriteLine("type /quit to exit"); - - - while (quitTyped == false) - { - string line = System.Console.ReadLine().TrimEnd("\r\n".ToCharArray()); - Program.Write(currentApp, line); - } - // We are done - System.Console.WriteLine("Console exit."); - } - - public void StopGUI() - { - // Console stop - } - #endregion - - #region GridLaunch Events - void Program_AppCreated(string App) - { - System.Console.WriteLine("Started: " + App); - if (!Apps.Contains(App)) - Apps.Add(App); - } - - void Program_AppRemoved(string App) - { - System.Console.WriteLine("Stopped: " + App); - if (Apps.Contains(App)) - Apps.Remove(App); - } - - void Program_AppConsoleOutput(string App, string Text) - { - System.Console.Write(App + ": " + Text); - } - #endregion - - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs deleted file mode 100644 index ca1bb30ef6..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.GridLaunch.GUI -{ - public interface IGUI - { - void StartGUI(); - void StopGUI(); - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs deleted file mode 100644 index 7fae830d75..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Text; -using System.Text.RegularExpressions; - -namespace OpenSim.GridLaunch.GUI.Network -{ - internal class Client - { - public TcpClient tcpClient; - private byte[] readBuffer = new byte[4096]; - private byte[] writeBuffer; - private TCPD tcp; - private string inputData = ""; - private object inputDataLock = new object(); - public Client(TCPD _tcp, TcpClient Client) - { - tcp = _tcp; - tcpClient = Client; - asyncReadStart(); - Write("OpenSim TCP Console GUI"); - Write("Use commands /0, /1, /2, etc to switch between applications."); - Write("Type /list for list of applications."); - Write("Anything that doesn't start with a / will be sent to selected application"); - Write("type /quit to exit"); - - } - - private void asyncReadStart() - { - tcpClient.GetStream().BeginRead(readBuffer, 0, readBuffer.Length, asyncReadCallBack, null); - } - - //private Regex LineExtractor = new Regex("^(.*)$") - private void asyncReadCallBack(IAsyncResult ar) - { - try - { - // Read data - int len = tcpClient.GetStream().EndRead(ar); - - // Send it to app - string newData = System.Text.Encoding.ASCII.GetString(readBuffer, 0, len); - //lock (inputDataLock) - //{ - inputData += newData; - if (newData.Contains("\n")) - SendInputLines(); - //} - - // Start it again - asyncReadStart(); - } - catch - { - // TODO: Remove client when we get exception - // Temp patch: if exception we don't call asyncReadStart() - } - } - - private void SendInputLines() - { - StringBuilder line = new StringBuilder(); - foreach (char c in inputData) - { - if (c == 13) - continue; - if (c == 10) - { - Program.WriteLine(tcp.currentApp, line.ToString()); - line = new StringBuilder(); - continue; - } - line.Append(c); - } - // We'll keep whatever is left over - inputData = line.ToString(); - } - - public void Write(string Text) - { - writeBuffer = Encoding.ASCII.GetBytes(Text); - tcpClient.GetStream().Write(writeBuffer, 0, writeBuffer.Length); - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs deleted file mode 100644 index b48cfeab88..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Net; -using System.Net.Sockets; -using System.Reflection; -using System.Text; -using System.Threading; -using log4net; - -namespace OpenSim.GridLaunch.GUI.Network -{ - public class TCPD : IGUI, IDisposable - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private List Clients = new List(); - - private readonly int defaultPort = 7998; - private TcpListener tcpListener; - private Thread listenThread; - private Thread clientThread; - - - private List Apps = new List(); - internal string currentApp = ""; - private bool quitTyped = false; - - public TCPD() - { - Program.AppCreated += Program_AppCreated; - Program.AppRemoved += Program_AppRemoved; - Program.AppConsoleOutput += Program_AppConsoleOutput; - Program.Command.CommandLine += Command_CommandLine; - - } - - ~TCPD() - { - Dispose(); - } - private bool isDisposed = false; - /// - ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - ///2 - public void Dispose() - { - if (isDisposed) - return; - isDisposed = true; - tcpd_Stop(); - } - - public void StartGUI() - { - // We are starting - tcpd_Start(); - } - - public void StopGUI() - { - // We are stopping - tcpd_Stop(); - } - - - #region GridLaunch Events - private void Command_CommandLine(string application, string command, string arguments) - { - // If command is a number then someone might be trying to change console: /1, /2, etc. - int currentAppNum = 0; - if (int.TryParse(command, out currentAppNum)) - if (currentAppNum <= Apps.Count) - { - currentApp = Apps[currentAppNum - 1]; - TCPWriteToAll("Changed console to app: " + currentApp + Environment.NewLine); - } - else - TCPWriteToAll("Unable to change to app number: " + currentAppNum + Environment.NewLine); - - // Has user typed quit? - if (command.ToLower() == "quit") - quitTyped = true; - - // Has user typed /list? - if (command.ToLower() == "list") - { - TCPWriteToAll("/0 Log console"); - for (int i = 1; i <= Apps.Count; i++) - { - TCPWriteToAll(string.Format("/{0} {1}", i, Apps[i - 1])); - } - } - - } - - void Program_AppCreated(string App) - { - TCPWriteToAll("Started: " + App); - if (!Apps.Contains(App)) - Apps.Add(App); - } - - void Program_AppRemoved(string App) - { - TCPWriteToAll("Stopped: " + App); - if (Apps.Contains(App)) - Apps.Remove(App); - } - - private void Program_AppConsoleOutput(string App, string Text) - { - TCPWriteToAll(App, Text); - } - - #endregion - - private void tcpd_Start() - { - listenThread = new Thread(new ThreadStart(ListenForClients)); - listenThread.Name = "TCPDThread"; - listenThread.IsBackground = true; - listenThread.Start(); - - while (!quitTyped) - { - Thread.Sleep(500); - } - - //clientThread = new Thread(new ThreadStart(ProcessClients)); - //clientThread.Name = "TCPClientThread"; - //clientThread.IsBackground = true; - ////clientThread.Start(); - - } - private void tcpd_Stop() - { - StopThread(listenThread); - StopThread(clientThread); - } - private void ListenForClients() - { - int Port = 0; - int.TryParse(Program.Settings["TCPPort"], out Port); - if (Port < 1) - Port = defaultPort; - - m_log.Info("Starting TCP Server on port " + Port); - this.tcpListener = new TcpListener(IPAddress.Any, Port); - - this.tcpListener.Start(); - - while (true) - { - // Blocks until a client has connected to the server - TcpClient tcpClient = this.tcpListener.AcceptTcpClient(); - Client client = new Client(this, tcpClient); - - lock (Clients) - { - Clients.Add(client); - } - System.Threading.Thread.Sleep(500); - } - } - - private static void StopThread(Thread t) - { - if (t != null) - { - m_log.Debug("Stopping thread " + t.Name); - try - { - if (t.IsAlive) - t.Abort(); - t.Join(2000); - t = null; - } - catch (Exception ex) - { - m_log.Error("Exception stopping thread: " + ex.ToString()); - } - } - } - - private void TCPWriteToAll(string app, string text) - { - TCPWriteToAll(text); - } - private void TCPWriteToAll(string text) - { - foreach (Client c in new ArrayList(Clients)) - { - try - { - c.Write(text); - } catch (Exception ex) - { - m_log.Error("Exception writing to TCP: " + ex.ToString()); - } - } - } - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs deleted file mode 100644 index f518bd79f7..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.ServiceProcess; -using System.Text; -using OpenSim.GridLaunch.GUI; - -namespace OpenSim.GridLaunch -{ - internal class Service: ServiceBase, IGUI - { - private ServiceBase[] ServicesToRun; - public Service() - { - ServicesToRun = new ServiceBase[] {this}; - } - - public void StartGUI() - { - ServiceBase.Run(ServicesToRun); - } - - public void StopGUI() - { - // Nothing - } - - protected override void OnStart(string[] args) - { - // Command line arguments override settings - Program.Settings.ParseCommandArguments(args); - } - - protected override void OnStop() - { - Program.Shutdown(); - } - - } -} \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Bottom Border.png b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Bottom Border.png deleted file mode 100644 index b3594b68007837ee38e4897e260909f2d022d629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryoCO|{#S9F5he4R}c>anMkc#3U zcPEB*=VV?2IV|apzK#qG8~eHcB(ehe3dtTpz6=aiY77hwEes65fIEak75uV&(eSm?1X&$4zcC6%Upg4o4tDnm{r-UW|5$YwU diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png deleted file mode 100644 index 8b03281febce2628e0bda720b2554df2589d1eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 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⋘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 diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs deleted file mode 100644 index 14987917fc..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs +++ /dev/null @@ -1,224 +0,0 @@ -namespace OpenSim.GridLaunch.GUI.WinForm -{ - partial class ProcessPanel - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProcessPanel)); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabLogs = new System.Windows.Forms.TabPage(); - this.btnShutdown = new System.Windows.Forms.Button(); - this.pictureBox2 = new System.Windows.Forms.PictureBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.pictureBox3 = new System.Windows.Forms.PictureBox(); - this.tabSettings = new System.Windows.Forms.TabPage(); - this.cblStartupComponents = new System.Windows.Forms.CheckedListBox(); - this.gbStartupComponents = new System.Windows.Forms.GroupBox(); - this.btnSave = new System.Windows.Forms.Button(); - this.ucLogWindow1 = new OpenSim.GridLaunch.GUI.WinForm.ucLogWindow(); - this.label1 = new System.Windows.Forms.Label(); - this.tabControl1.SuspendLayout(); - this.tabLogs.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); - this.tabSettings.SuspendLayout(); - this.gbStartupComponents.SuspendLayout(); - this.SuspendLayout(); - // - // tabControl1 - // - this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tabControl1.Controls.Add(this.tabSettings); - this.tabControl1.Controls.Add(this.tabLogs); - this.tabControl1.Location = new System.Drawing.Point(-1, 123); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(632, 275); - this.tabControl1.TabIndex = 0; - // - // tabLogs - // - this.tabLogs.Controls.Add(this.ucLogWindow1); - this.tabLogs.Location = new System.Drawing.Point(4, 22); - this.tabLogs.Name = "tabLogs"; - this.tabLogs.Padding = new System.Windows.Forms.Padding(3); - this.tabLogs.Size = new System.Drawing.Size(624, 249); - this.tabLogs.TabIndex = 0; - this.tabLogs.Text = "Logs"; - this.tabLogs.UseVisualStyleBackColor = true; - // - // btnShutdown - // - this.btnShutdown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnShutdown.Location = new System.Drawing.Point(542, 400); - this.btnShutdown.Name = "btnShutdown"; - this.btnShutdown.Size = new System.Drawing.Size(75, 23); - this.btnShutdown.TabIndex = 1; - this.btnShutdown.Text = "Shutdown"; - this.btnShutdown.UseVisualStyleBackColor = true; - this.btnShutdown.Click += new System.EventHandler(this.btnShutdown_Click); - // - // pictureBox2 - // - this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); - this.pictureBox2.Location = new System.Drawing.Point(585, -1); - this.pictureBox2.Name = "pictureBox2"; - this.pictureBox2.Size = new System.Drawing.Size(46, 124); - this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pictureBox2.TabIndex = 3; - this.pictureBox2.TabStop = false; - // - // pictureBox1 - // - this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); - this.pictureBox1.Location = new System.Drawing.Point(-1, -1); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(586, 124); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; - this.pictureBox1.TabIndex = 2; - this.pictureBox1.TabStop = false; - // - // pictureBox3 - // - this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.pictureBox3.Image = global::OpenSim.GridLaunch.Properties.Resources.OpenSim_Bottom_Border; - this.pictureBox3.Location = new System.Drawing.Point(-1, 120); - this.pictureBox3.Name = "pictureBox3"; - this.pictureBox3.Size = new System.Drawing.Size(632, 310); - this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pictureBox3.TabIndex = 4; - this.pictureBox3.TabStop = false; - // - // tabSettings - // - this.tabSettings.Controls.Add(this.label1); - this.tabSettings.Controls.Add(this.btnSave); - this.tabSettings.Controls.Add(this.gbStartupComponents); - this.tabSettings.Location = new System.Drawing.Point(4, 22); - this.tabSettings.Name = "tabSettings"; - this.tabSettings.Padding = new System.Windows.Forms.Padding(3); - this.tabSettings.Size = new System.Drawing.Size(624, 249); - this.tabSettings.TabIndex = 1; - this.tabSettings.Text = "Settings"; - this.tabSettings.UseVisualStyleBackColor = true; - // - // cblStartupComponents - // - this.cblStartupComponents.CheckOnClick = true; - this.cblStartupComponents.FormattingEnabled = true; - this.cblStartupComponents.Location = new System.Drawing.Point(6, 19); - this.cblStartupComponents.Name = "cblStartupComponents"; - this.cblStartupComponents.Size = new System.Drawing.Size(202, 109); - this.cblStartupComponents.TabIndex = 0; - // - // gbStartupComponents - // - this.gbStartupComponents.Controls.Add(this.cblStartupComponents); - this.gbStartupComponents.Location = new System.Drawing.Point(9, 6); - this.gbStartupComponents.Name = "gbStartupComponents"; - this.gbStartupComponents.Size = new System.Drawing.Size(214, 136); - this.gbStartupComponents.TabIndex = 1; - this.gbStartupComponents.TabStop = false; - this.gbStartupComponents.Text = "Startup components"; - // - // btnSave - // - this.btnSave.Location = new System.Drawing.Point(9, 148); - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(92, 23); - this.btnSave.TabIndex = 2; - this.btnSave.Text = "Save settings"; - this.btnSave.UseVisualStyleBackColor = true; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // ucLogWindow1 - // - this.ucLogWindow1.Dock = System.Windows.Forms.DockStyle.Fill; - this.ucLogWindow1.Location = new System.Drawing.Point(3, 3); - this.ucLogWindow1.Name = "ucLogWindow1"; - this.ucLogWindow1.Size = new System.Drawing.Size(618, 243); - this.ucLogWindow1.TabIndex = 0; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(108, 149); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(259, 13); - this.label1.TabIndex = 3; - this.label1.Text = "* You have to restart app before changes take effect."; - // - // ProcessPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(629, 428); - this.Controls.Add(this.pictureBox2); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.btnShutdown); - this.Controls.Add(this.tabControl1); - this.Controls.Add(this.pictureBox3); - this.Name = "ProcessPanel"; - this.Text = "OpenSim GUI alpha"; - this.Load += new System.EventHandler(this.ProcessPanel_Load); - this.tabControl1.ResumeLayout(false); - this.tabLogs.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); - this.tabSettings.ResumeLayout(false); - this.tabSettings.PerformLayout(); - this.gbStartupComponents.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabLogs; - private System.Windows.Forms.Button btnShutdown; - private ucLogWindow ucLogWindow1; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.PictureBox pictureBox2; - private System.Windows.Forms.PictureBox pictureBox3; - private System.Windows.Forms.TabPage tabSettings; - private System.Windows.Forms.GroupBox gbStartupComponents; - private System.Windows.Forms.CheckedListBox cblStartupComponents; - private System.Windows.Forms.Button btnSave; - private System.Windows.Forms.Label label1; - - } -} \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.cs deleted file mode 100644 index f0ed2ca7b6..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.cs +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Diagnostics; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace OpenSim.GridLaunch.GUI.WinForm -{ - public partial class ProcessPanel : Form, IGUI - { - public ProcessPanel() - { - Application.EnableVisualStyles(); - //Application.SetCompatibleTextRenderingDefault(false); - - InitializeComponent(); - Program.AppCreated += Program_AppCreated; - Program.AppRemoved += Program_AppRemoved; - Program.AppConsoleOutput += Program_AppConsoleOutput; - Program.AppConsoleError += Program_AppConsoleError; - log4netAppender.LogLine += log4netAppender_LogLine; - } - - #region Module Start / Stop - public void StartGUI() - { - Application.Run(this); - } - - public void StopGUI() - { - this.Close(); - } - #endregion - - #region Main log tab - void log4netAppender_LogLine(Color color, string LogText) - { - ucLogWindow1.Write(color, LogText); - } - #endregion - - #region Form events - private void btnShutdown_Click(object sender, EventArgs e) - { - Program.Shutdown(); - } - #endregion - - #region GridLaunch Events - public delegate void Program_AppCreatedDelegate(string App); - public void Program_AppCreated(string App) - { - if (this.InvokeRequired) { - this.Invoke(new Program_AppCreatedDelegate(Program_AppCreated), App); - return; - } - - Trace.WriteLine("Start: " + App); - - // Do we already have app window for that app? - if (AppWindow_Get(App) != null) - return; - - // New log window - ucAppWindow aw = new ucAppWindow(); - // New tab page - TabPage tp = new TabPage(App); - // Add log window into tab page - tp.Controls.Add(aw); - // Add tab page into tab control - tabControl1.TabPages.Add(tp); - // Add it all to our internal list - AppWindow_Add(App, aw); - // Hook up events - aw.LineEntered += AppWindow_LineEntered; - - // Fill log window fully inside tab page - aw.Dock = DockStyle.Fill; - } - - - public delegate void Program_AppRemovedDelegate(string App); - public void Program_AppRemoved(string App) - { - if (this.InvokeRequired) { - this.Invoke(new Program_AppRemovedDelegate(Program_AppRemoved), App); - return; - } - - Trace.WriteLine("Stop: " + App); - - // Get app window - ucAppWindow aw = AppWindow_Get(App); - if (aw == null) - return; - - // Get its tab page - TabPage tp = aw.Parent as TabPage; - - if (tp != null) - { - // Remove tab page from tab control - tabControl1.TabPages.Remove(tp); - // Remove app window from tab - tp.Controls.Remove(aw); - } - - // Dispose of app window - aw.Dispose(); - - // Dispose of tab page - if (tp != null) - tp.Dispose(); - - // Remove from our internal list - AppWindow_Remove(App); - } - - - public delegate void Program_AppConsoleOutputDelegate(string App, string LogText); - void Program_AppConsoleOutput(string App, string LogText) - { - if (this.InvokeRequired) - { - this.Invoke(new Program_AppConsoleOutputDelegate(Program_AppConsoleOutput), App, LogText); - return; - } - - // Get app window - ucAppWindow aw = AppWindow_Get(App); - // Write text to it - if (aw != null) - aw.Write(System.Drawing.Color.Black, LogText); - } - - public delegate void Program_AppConsoleErrorDelegate(string App, string LogText); - void Program_AppConsoleError(string App, string LogText) - { - if (this.InvokeRequired) { - this.Invoke(new Program_AppConsoleErrorDelegate(Program_AppConsoleError), App, LogText); - return; - } - - // Get app window - ucAppWindow aw = AppWindow_Get(App); - // Write text to it - if (aw != null) - aw.Write(System.Drawing.Color.Red, LogText); - - } - #endregion - - #region App Window events - private void AppWindow_LineEntered(ucAppWindow AppWindow, string LogText) - { - Program.WriteLine(AppWindow_Get(AppWindow), LogText); - } - #endregion - - private void ProcessPanel_Load(object sender, EventArgs e) - { - string[] arr = new string[Program.Settings.Components.Keys.Count]; - Program.Settings.Components.Keys.CopyTo(arr, 0); - cblStartupComponents.Items.AddRange(arr); - - // Now correct all check states - for (int i = 0; i < cblStartupComponents.Items.Count; i++) - { - string _name = cblStartupComponents.Items[i] as string; - bool _checked = Program.Settings.Components[_name]; - - cblStartupComponents.SetItemChecked(i, _checked); - } - - - } - - - - - #region Internal App Window list and functions - private Dictionary _appWindows = new Dictionary(); - private Dictionary _appWindows_rev = new Dictionary(); - private void AppWindow_Add(string AppWindowName, ucAppWindow AppWindow) - { - lock (_appWindows) - { - _appWindows.Add(AppWindowName, AppWindow); - _appWindows_rev.Add(AppWindow, AppWindowName); - // Hook events - AppWindow.LineEntered += AppWindow_LineEntered; - } - } - private void AppWindow_Remove(ucAppWindow AppWindow) - { - lock (_appWindows) - { - if (_appWindows_rev.ContainsKey(AppWindow)) - { - // Unhook events - AppWindow.LineEntered -= AppWindow_LineEntered; - // Delete from list - string name = _appWindows_rev[AppWindow]; - _appWindows.Remove(name); - _appWindows_rev.Remove(AppWindow); - } - } - } - private void AppWindow_Remove(string AppWindowName) - { - lock (_appWindows) - { - if (_appWindows.ContainsKey(AppWindowName)) - { - ucAppWindow AppWindow = _appWindows[AppWindowName]; - // Unhook events - AppWindow.LineEntered -= AppWindow_LineEntered; - // Delete from list - _appWindows.Remove(AppWindowName); - _appWindows_rev.Remove(AppWindow); - } - } - } - private string AppWindow_Get(ucAppWindow AppWindow) - { - lock (_appWindows) - { - if (_appWindows_rev.ContainsKey(AppWindow)) - return _appWindows_rev[AppWindow]; - } - return null; - } - private ucAppWindow AppWindow_Get(string AppWindowName) - { - lock (_appWindows) - { - if (_appWindows.ContainsKey(AppWindowName)) - return _appWindows[AppWindowName]; - } - return null; - } - #endregion - - private void btnSave_Click(object sender, EventArgs e) - { - Program.Settings.Components.Clear(); - for (int i = 0; i < cblStartupComponents.Items.Count; i++) - { - string _name = cblStartupComponents.Items[i] as string; - bool _checked = cblStartupComponents.GetItemChecked(i); - - Program.Settings.Components.Add(_name, _checked); - Program.Settings.SaveConfig(); - } - } - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx deleted file mode 100644 index 361d658d48..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx +++ /dev/null @@ -1,882 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - iVBORw0KGgoAAAANSUhEUgAAAAEAAAB8CAIAAAAny03BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOpgAA - DqYBh9ypbwAAAYpJREFUKFOV0fkrH3AYwPG3Y84NW2xzj76btomJHE20NUcpi9DKUlt+0i6EjbnmiOWY - ZTKSo69YtolNRHOEYWsIK8sksiZZU5Ompo8n379gP7x63s/z+fEDdz7w3+4Oondv6JD+/WH0H4xgkDx6 - yDBlDMPUcY6kfcQofQKjjEmMH05h8ugTppmfMc36gtnjacyzZziaM8uxvDks8uexfLKAVcFXjhctcqL4 - G9YlS9iUfufk02VOla9wumIV28o17KvWcXj+A8fqnzi92MC5ZhOX2i1cX/5CU/8bTcM25xr/4Na0w/mW - XS5q/+LeuodH2z882ve51KHweq3wfqvw6VT4din83ykC3isu9yoC+xRB/Qq7bHDIBfs8sJPpWABOxXIr - lFsRuJaJCtA8gzPibDVcqAE34VknXStv0n7N0rJ7N0m3QIAWrrZBYCtcewVXRLAIeQMRnXKTGdmtE9YF - 0T0QLh0lM6YProu4fgjthRsDcFO+79YQJIhY6fhBSByB26M6SeM6idIJwxwAjlSW4/2by3sAAAAASUVO - RK5CYII= - - - - - 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 - OxA5OCbeDtx9K3DPLXK640Zg0m2SxhFsyEF63x2SBmfMDVIQl9RsuASBrCx4dt0MSL4dkHgrYNdNUvWO - m/6xN/ygz64bvjtv+MTf9Iq76Rl/02PnDbfNV12h/7orTpuuOq5ttlt/2WZlk/W6ZstVTebRTcoVjWZR - jfLIepNFdUaL66QLayXL6g1mVIvn1ujPrhYtqhVNuSicfUk48YLOrIuC6RcF484LJp7nj0WIRkELIAeE - mH2JNwYB03nejIskjfwhQBp6aTgFnvHnyKXJNAFO8IymObiE04kI+3BHjeYgDTkzL6lEAR0hB/lgQ3Gk - cUQaVSCBq+ojCk6hmUwZJFgaRQi40iMYUAvTQa0Ypz9nfwwVbvxw8/df6n9482qAbcLZNboTLogmXxLN - rtZfWi+edslgYZ1kUZ00ssF4Wo0JQC6q0XRFo2J1szK62WLLVQpyV222XrXbcMVh61XHbdec1lx22XXD - Jfa6647rbvE33Xfc8Nh23XPnTc/Y616brgFRvHfd9N59E+jik3jbZ8cNH6S3XScUd9Nn1w2fPTd9Ym+Q - NEVHkgaBB8e9t0gOOHfd9Nl+nZxGX1FdAlyxq6At1wgPchJueW+5huq8dt7wggJrrwJ0AWbu26+7xV53 - 236d6em8/Zrj9msO6y/bbbpiu/GKTWSj1eYrlmuaCbCtazZb0QhQl6H5C2ql06oNF9dJFtSJ59WKF9Tq - LakjSwEYbfx54bjzOjMuCaZcEMy8JJhwgT/1IsGVaQAebDCep6hDAQn5I8/yJlEIwWk/7EDSSwyuplwk - NBx3wiiezakmzMgBD44RuE+GSAvxH6I3ygkGAnKXyBH8uARCceQjAQWQABvk44iyuIR8Vgu7ikykUQur - CEIIWNJMcKIWKM/pz9mfGz/c/P1X+x/e/DodeOq5NcL5tboL60RL6vUW1ukvqhMvbTCYVC1ZUi9d3mC0 - pM5kaYNsSb18Xj0CGsXGK8o1zRZrL1tGN1mtabbZeNVm4xWAhN3mq/ZAuw1XHLdfd9py1WkHQRGXXTdd - tl1z2XnDJeY6AT+EehuvusbddN12jdDWa67br7nuvEmOSG++5hpzzXXXTYSDrltoGoRM5IAZxVEWzLgK - fpazm57uuOG6E3STnMai3hukxlVXSNUx1503XyH6rL/iGHXZYdMV+5jrdhuv2G64YgPl0YR1pCHmQO6o - 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 - - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.Designer.cs deleted file mode 100644 index 1ff7d434bd..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.Designer.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace OpenSim.GridLaunch.GUI.WinForm -{ - partial class ucAppWindow - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ucLogWindow1 = new OpenSim.GridLaunch.GUI.WinForm.ucLogWindow(); - this.ucInputField1 = new OpenSim.GridLaunch.GUI.WinForm.ucInputField(); - this.SuspendLayout(); - // - // ucLogWindow1 - // - this.ucLogWindow1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ucLogWindow1.Location = new System.Drawing.Point(3, 3); - this.ucLogWindow1.Name = "ucLogWindow1"; - this.ucLogWindow1.Size = new System.Drawing.Size(232, 132); - this.ucLogWindow1.TabIndex = 0; - // - // ucInputField1 - // - this.ucInputField1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ucInputField1.Location = new System.Drawing.Point(0, 141); - this.ucInputField1.Name = "ucInputField1"; - this.ucInputField1.Size = new System.Drawing.Size(234, 30); - this.ucInputField1.TabIndex = 1; - // - // ucAppWindow - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.ucInputField1); - this.Controls.Add(this.ucLogWindow1); - this.DoubleBuffered = true; - this.Name = "ucAppWindow"; - this.Size = new System.Drawing.Size(235, 166); - this.ResumeLayout(false); - - } - - #endregion - - private ucLogWindow ucLogWindow1; - private ucInputField ucInputField1; - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs deleted file mode 100644 index 487faeca49..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - -namespace OpenSim.GridLaunch.GUI.WinForm -{ - public partial class ucAppWindow : UserControl - { - // Just forwarding from ucInputField1 - public delegate void LineEnteredDelegate(ucAppWindow AppWindow, string Text); - public event LineEnteredDelegate LineEntered; - - public ucAppWindow() - { - InitializeComponent(); - ucInputField1.LineEntered += ucInputField1_LineEntered; - } - - #region Forward Text Input Event and Log Write Function - void ucInputField1_LineEntered(string Text) - { - if (LineEntered != null) - LineEntered(this, Text); - } - - public void Write(Color color, string LogText) - { - ucLogWindow1.Write(color, LogText); - } - #endregion - - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.Designer.cs deleted file mode 100644 index 1eaec69429..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.Designer.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace OpenSim.GridLaunch.GUI.WinForm -{ - partial class ucInputField - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.txtInput = new System.Windows.Forms.TextBox(); - this.btnSend = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // txtInput - // - this.txtInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtInput.Location = new System.Drawing.Point(3, 2); - this.txtInput.Name = "txtInput"; - this.txtInput.Size = new System.Drawing.Size(289, 20); - this.txtInput.TabIndex = 0; - this.txtInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtInput_KeyPress); - // - // btnSend - // - this.btnSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.btnSend.Location = new System.Drawing.Point(295, 0); - this.btnSend.Name = "btnSend"; - this.btnSend.Size = new System.Drawing.Size(75, 23); - this.btnSend.TabIndex = 3; - this.btnSend.Text = "&Send"; - this.btnSend.UseVisualStyleBackColor = true; - this.btnSend.Click += new System.EventHandler(this.btnSend_Click); - // - // ucInputField - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.btnSend); - this.Controls.Add(this.txtInput); - this.Name = "ucInputField"; - this.Size = new System.Drawing.Size(373, 25); - this.Load += new System.EventHandler(this.ucInputField_Load); - this.Resize += new System.EventHandler(this.ucInputField_Resize); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox txtInput; - private System.Windows.Forms.Button btnSend; - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs deleted file mode 100644 index f6c02b523b..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - -namespace OpenSim.GridLaunch.GUI.WinForm -{ - public partial class ucInputField : UserControl - { - public delegate void LineEnteredDelegate(string Text); - public event LineEnteredDelegate LineEntered; - - public List History = new List(); - - public ucInputField() - { - InitializeComponent(); - } - - private void ucInputField_Load(object sender, EventArgs e) - { - _resize(); - } - - private void ucInputField_Resize(object sender, EventArgs e) - { - _resize(); - } - - private void _resize() - { - Height = txtInput.Height + 10; - } - - private void btnSend_Click(object sender, EventArgs e) - { - Send(); - } - - private void txtInput_KeyPress(object sender, KeyPressEventArgs e) - { - //Trace.WriteLine("KeyChar: " + ((int)e.KeyChar).ToString()); - if (e.KeyChar == 13) - { - e.Handled = true; - Send(); - } - - // TODO: Add arrow up/down history functions - } - - private void Send() - { - // Remove \r\n at end - string txt = txtInput.Text.TrimEnd("\r\n".ToCharArray()); - - // Fire event - if (LineEntered != null) - LineEntered(txt); - - // Add to history - History.Add(txtInput.Text); - - txtInput.Text = ""; - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.Designer.cs deleted file mode 100644 index 839fe9905f..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace OpenSim.GridLaunch.GUI.WinForm -{ - partial class ucLogWindow - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.txtLog = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // txtLog - // - this.txtLog.BackColor = System.Drawing.SystemColors.Window; - this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; - this.txtLog.Location = new System.Drawing.Point(0, 0); - this.txtLog.Multiline = true; - this.txtLog.Name = "txtLog"; - this.txtLog.ReadOnly = true; - this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txtLog.Size = new System.Drawing.Size(150, 150); - this.txtLog.TabIndex = 0; - this.txtLog.TextChanged += new System.EventHandler(this.txtLog_TextChanged); - // - // ucLogWindow - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.txtLog); - this.Name = "ucLogWindow"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox txtLog; - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs deleted file mode 100644 index 84c0a14777..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - -namespace OpenSim.GridLaunch.GUI.WinForm -{ - public partial class ucLogWindow : UserControl - { - // If text in window is more than this - private static readonly int logWindowMaxTextLength = 20000; - // Remove this much from start of it - private static int logWindowTrunlTextLength = 10000; - - public ucLogWindow() - { - if (logWindowMaxTextLength < logWindowTrunlTextLength) - logWindowTrunlTextLength = logWindowMaxTextLength / 2; - - InitializeComponent(); - } - - public delegate void textWriteDelegate(Color color, string LogText); - public void Write(Color color, string LogText) - { - // Check if we to pass task on to GUI thread - if (this.InvokeRequired) - { - this.Invoke(new textWriteDelegate(Write), color, LogText); - return; - } - // Append to window - try - { - if (!txtLog.IsDisposed) - txtLog.AppendText(LogText); - } catch { } - } - - private void txtLog_TextChanged(object sender, EventArgs e) - { - // Go to bottom of window - txtLog.ScrollToCaret(); - - // Make sure amount of text in window doesn't grow too big - if (txtLog.Text.Length > logWindowMaxTextLength) - txtLog.Text = txtLog.Text.Remove(0, logWindowTrunlTextLength); - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj deleted file mode 100644 index b262dd152c..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj +++ /dev/null @@ -1,126 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {595D67F3-B413-4A43-8568-5B5930E3B31D} - Exe - Properties - OpenSim.GridLaunch - OpenSim.GridLaunch - v2.0 - 512 - - - true - full - false - ..\..\..\bin\ - DEBUG;TRACE - prompt - 4 - x86 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - Component - - - Form - - - ProcessPanel.cs - - - UserControl - - - ucAppWindow.cs - - - UserControl - - - ucInputField.cs - - - UserControl - - - ucLogWindow.cs - - - - - - True - True - Resources.resx - - - - - - ProcessPanel.cs - - - ucAppWindow.cs - - - ucInputField.cs - - - ucLogWindow.cs - - - - - - - - - - - PreserveNewest - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini deleted file mode 100644 index c065898b1d..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini +++ /dev/null @@ -1,3 +0,0 @@ -GUI=WinForm -;GUI=TCPD -;Components=c:\temp\test.bat;true \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.sln b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.sln deleted file mode 100644 index 8f745e11ba..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridLaunch", "OpenSim.GridLaunch.csproj", "{595D67F3-B413-4A43-8568-5B5930E3B31D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Program.cs b/OpenSim/Tools/OpenSim.GridLaunch/Program.cs deleted file mode 100644 index ecfb0af381..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/Program.cs +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Threading; -using log4net; -using log4net.Appender; -using log4net.Repository.Hierarchy; -using OpenSim.GridLaunch.GUI; -using OpenSim.GridLaunch.GUI.Network; - -namespace OpenSim.GridLaunch -{ - class Program - { - public static readonly string ConfigFile = "OpenSim.GridLaunch.ini"; - internal static Dictionary AppList = new Dictionary(); - private static readonly int delayBetweenExecuteSeconds = 10; - //private static readonly int consoleReadIntervalMilliseconds = 50; - ////private static readonly Timer readTimer = new Timer(readConsole, null, Timeout.Infinite, Timeout.Infinite); - //private static Thread timerThread; - //private static object timerThreadLock = new object(); - private static IGUI GUIModule; - private static string GUIModuleName = ""; - public static readonly CommandProcessor Command = new CommandProcessor(); - public static readonly Settings Settings = new Settings(); - - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public delegate void AppConsoleOutputDelegate(string App, string Text); - public static event AppConsoleOutputDelegate AppConsoleOutput; - public delegate void AppConsoleErrorDelegate(string App, string Text); - public static event AppConsoleErrorDelegate AppConsoleError; - public delegate void AppCreatedDelegate(string App); - public static event AppCreatedDelegate AppCreated; - public delegate void AppRemovedDelegate(string App); - public static event AppRemovedDelegate AppRemoved; - - internal static void FireAppConsoleOutput(string App, string Text) - { - if (AppConsoleOutput != null) - AppConsoleOutput(App, Text); - } - internal static void FireAppConsoleError(string App, string Text) - { - if (AppConsoleError != null) - AppConsoleError(App, Text); - } - - - private static readonly object startStopLock = new object(); - - public static string Name { get { return "OpenSim Grid executor"; } } - - #region Start/Shutdown - static void Main(string[] args) - { - log4net.Config.XmlConfigurator.Configure(); - - // Startup - m_log.Info(Name); - m_log.Info(new string('-', Name.Length)); - - // Read settings - Settings.LoadConfig(ConfigFile); - // Command line arguments override settings - Settings.ParseCommandArguments(args); - - // Start GUI module - StartGUIModule(); - - // Start the processes - ThreadPool.QueueUserWorkItem(startProcesses); - - // Hand over thread control to whatever GUI module - GUIModule.StartGUI(); - - // GUI module returned, we are done - Shutdown(); - - } - - private static void StartGUIModule() - { - // Create GUI module - GUIModuleName = Settings["GUI"]; - - switch (GUIModuleName.ToLower()) - { - case "winform": - GUIModuleName = "WinForm"; - GUIModule = new GUI.WinForm.ProcessPanel(); - break; - case "service": - GUIModuleName = "Service"; - GUIModule = new Service(); - break; - case "tcpd": - GUIModuleName = "TCPD"; - GUIModule = new TCPD(); - break; - case "console": - default: - GUIModuleName = "Console"; - GUIModule = new GUI.Console.Console(); - break; - } - m_log.Info("GUI type: " + GUIModuleName); - - } - - internal static void Shutdown() - { - // Stop the processes - stopProcesses(); - - lock (startStopLock) - { - // Stop GUI module - if (GUIModule != null) - { - GUIModule.StopGUI(); - GUIModule = null; - } - } - } - - internal static void SafeDisposeOf(object obj) - { - IDisposable o = obj as IDisposable; - try - { - if (o != null) - o.Dispose(); - } - catch { } - } - #endregion - - #region Start / Stop applications - private static void startProcesses(Object stateInfo) - { - // Stop before starting - stopProcesses(); - - // Start console read timer - //timer_Start(); - - // Start the applications - foreach (string file in new ArrayList(Settings.Components.Keys)) - { - // Is this file marked for startup? - if (Settings.Components[file]) - { - AppExecutor app = new AppExecutor(file); - app.Start(); - AppList.Add(file, app); - if (AppCreated != null) - AppCreated(app.File); - System.Threading.Thread.Sleep(1000*delayBetweenExecuteSeconds); - } - } - } - - private static void stopProcesses() - { - // Stop timer - //timer_Stop(); - - // Lock so we don't collide with any timer still executing on AppList - lock (AppList) - { - // Start the applications - foreach (AppExecutor app in AppList.Values) - { - try - { - m_log.Info("Stopping: " + app.File); - app.Stop(); - } - catch (Exception ex) - { - m_log.ErrorFormat("Exception while stopping \"{0}\": {1}", app.File, ex.ToString()); - } - finally - { - if (AppRemoved != null) - AppRemoved(app.File); - app.Dispose(); - } - - } - AppList.Clear(); - } - } - #endregion - - public static void Write(string App, string Text) - { - // Check if it is a commands - bool isCommand = Command.Process(App, Text); - - // Write to stdInput of app - if (!isCommand && AppList.ContainsKey(App)) - AppList[App].Write(Text); - } - - public static void WriteLine(string App, string Text) - { - // Check if it is a commands - bool isCommand = Command.Process(App, Text); - - // Write to stdInput of app - if (!isCommand && AppList.ContainsKey(App)) - AppList[App].WriteLine(Text); - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs b/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs deleted file mode 100644 index 60fc664401..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OpenSim.GridLaunch")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("http://opensimulator.org")] -[assembly: AssemblyProduct("OpenSim.GridLaunch")] -[assembly: AssemblyCopyright("Copyright (c) 2008")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5072e919-46ab-47e6-8a63-08108324ccdf")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.6.3.*")] -[assembly: AssemblyVersion("0.6.3.*")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.Designer.cs deleted file mode 100644 index 88b0cebdd9..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.Designer.cs +++ /dev/null @@ -1,84 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.3053 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace OpenSim.GridLaunch.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenSim.GridLaunch.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - internal static System.Drawing.Bitmap OpenSim { - get { - object obj = ResourceManager.GetObject("OpenSim", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap OpenSim_Bottom_Border { - get { - object obj = ResourceManager.GetObject("OpenSim_Bottom_Border", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - internal static System.Drawing.Bitmap OpenSim_Right_Border { - get { - object obj = ResourceManager.GetObject("OpenSim_Right_Border", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx b/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx deleted file mode 100644 index b82a1fced2..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\gui\winform\opensim.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\gui\winform\opensim bottom border.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\gui\winform\opensim right border.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs b/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs deleted file mode 100644 index 1f02928b4d..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Text; -using log4net; - -namespace OpenSim.GridLaunch -{ - internal class Settings - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private Dictionary Config = new Dictionary(); - public Dictionary Components = new Dictionary(); - - public static string[] defaultComponents = new string[] - { - "OpenSim.Grid.UserServer.exe", - "OpenSim.Grid.GridServer.exe", - "OpenSim.Grid.AssetServer.exe", - "OpenSim.Grid.InventoryServer.exe", - "OpenSim.Grid.MessagingServer.exe", - "OpenSim.32BitLaunch.exe" - }; - - - private static readonly char[] confSplit = new char[] { '=' }; - private static readonly char[] comaSplit = new char[] { ',' }; - private static readonly char[] colonSplit = new char[] { ';' }; - - private string configFile = ""; - - public Settings() - { - } - public Settings(string ConfigFile) - { - LoadConfig(ConfigFile); - } - - - public void LoadConfig(string ConfigFile) - { - configFile = ConfigFile; - m_log.Info("Reading config file: " + ConfigFile); - try - { - // Read config file - foreach (string line in System.IO.File.ReadAllLines(ConfigFile)) - { - string[] s = line.Split(confSplit, 2); - if (s.Length >= 2) - Config.Add(s[0], s[1]); - } - - // Process Components section - string cmp = Config["Components"]; - Config.Remove("Components"); - foreach (string c in cmp.Split(comaSplit)) - { - string[] cs = c.Split(colonSplit); - if (cs.Length >= 2) - { - bool status = false; - bool.TryParse(cs[1], out status); - Components.Add(cs[0], status); - } - } - } - catch (Exception ex) - { - m_log.Error("Exception reading config file: " + ex.ToString()); - } - // No components? Add default components - if (Components.Count == 0) - foreach (string c in defaultComponents) - { - Components.Add(c, true); - } - } - - public void SaveConfig(string ConfigFile) - { - configFile = ConfigFile; - SaveConfig(); - } - - public void SaveConfig() - { - m_log.Info("Writing config file: " + configFile); - try - { - System.IO.File.WriteAllText(configFile, ToString()); - } - catch (Exception ex) - { - m_log.Error("Exception writing config file: " + ex.ToString()); - } - - } - - public new string ToString() - { - StringBuilder ret = new StringBuilder(); - - Dictionary config = new Dictionary(Config); - - // Add Components key - StringBuilder _Components = new StringBuilder(); - foreach (string c in Components.Keys) - { - if (_Components.Length > 0) - _Components.Append(","); - _Components.Append(c + ";" + Components[c].ToString()); - } - config["Components"] = _Components.ToString(); - - // Make return string - foreach (string key in config.Keys) - { - ret.AppendLine(key + "=" + config[key]); - } - - // Return it - return ret.ToString(); - } - - public string this[string Key] - { - get - { - if (Config.ContainsKey(Key)) - return Config[Key]; - return ""; - } - set { Config[Key] = value; } - } - - public void ParseCommandArguments(string[] args) - { - string key = null; - foreach (string a in args) - { - if (a.StartsWith("--")) - key = a.Remove(0, 2); - else - { - if (key != null) - Config[key] = a; - key = null; - } - } - - } - } -} diff --git a/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs b/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs deleted file mode 100644 index d0e7f95d1a..0000000000 --- a/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using log4net.Appender; -using log4net.Core; - -namespace OpenSim.GridLaunch -{ - internal class log4netAppender : log4net.Appender.AppenderSkeleton - { - public delegate void LogLineDelegate(Color color, string Text); - public static event LogLineDelegate LogLine; - public static readonly Dictionary Level2Color = new Dictionary(); - - static log4netAppender() - { - Level2Color.Add("INFO", Color.Black); - Level2Color.Add("DEBUG", Color.Gray); - Level2Color.Add("WARN", Color.OrangeRed); - Level2Color.Add("ERROR", Color.Red); - } - - - protected override void Append(LoggingEvent loggingEvent) - { - // Find appropriate color - Color color = Color.Black; - if (Level2Color.ContainsKey(loggingEvent.Level.Name)) - color = Level2Color[loggingEvent.Level.Name]; - - // Fire event with new log message - if (LogLine != null) - LogLine(color, loggingEvent.RenderedMessage + System.Environment.NewLine); - } - - } -}