diff options
author | Tedd Hansen | 2008-12-06 03:28:34 +0000 |
---|---|---|
committer | Tedd Hansen | 2008-12-06 03:28:34 +0000 |
commit | f2cbc48a9e704da8e86ed659437c1e338e212c50 (patch) | |
tree | 483255008f063c08d541ae56760f894273eaf041 /OpenSim | |
parent | Minor formatting cleanup. (diff) | |
download | opensim-SC-f2cbc48a9e704da8e86ed659437c1e338e212c50.zip opensim-SC-f2cbc48a9e704da8e86ed659437c1e338e212c50.tar.gz opensim-SC-f2cbc48a9e704da8e86ed659437c1e338e212c50.tar.bz2 opensim-SC-f2cbc48a9e704da8e86ed659437c1e338e212c50.tar.xz |
GUI for launching grids. Early version, but should work fine.
Will execute all OpenSim services redirect their input/output/errors to the selected "GUI module".
This version has following "GUI modules":
* Windows Forms
* Windows Service (doesn't work yet)
* Console
* TCP daemon
This means that OpenSim can now run in a single console for those who want that.
Console functionallity is not too rich yet, but code/framework is there... more to come. :)
Diffstat (limited to '')
34 files changed, 4274 insertions, 0 deletions
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/App.config b/OpenSim/Tools/OpenSim.GridLaunch/App.config new file mode 100644 index 0000000..1e53319 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/App.config | |||
@@ -0,0 +1,40 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" ?> | ||
2 | <configuration> | ||
3 | <configSections> | ||
4 | <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> | ||
5 | </configSections> | ||
6 | <runtime> | ||
7 | <gcConcurrent enabled="true" /> | ||
8 | <gcServer enabled="true" /> | ||
9 | </runtime> | ||
10 | <appSettings> | ||
11 | </appSettings> | ||
12 | <log4net> | ||
13 | <appender name="LogForwarder" type="OpenSim.GridLaunch.log4netAppender"> | ||
14 | <layout type="log4net.Layout.PatternLayout"> | ||
15 | <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> | ||
16 | </layout> | ||
17 | </appender> | ||
18 | |||
19 | <appender name="TraceWriter" type="log4net.Appender.TraceAppender"> | ||
20 | <layout type="log4net.Layout.PatternLayout"> | ||
21 | <conversionPattern value="%date{HH:mm:ss} - %message%newline" /> | ||
22 | </layout> | ||
23 | </appender> | ||
24 | |||
25 | <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> | ||
26 | <file value="OpenSim.GridLaunch.log" /> | ||
27 | <appendToFile value="true" /> | ||
28 | <layout type="log4net.Layout.PatternLayout"> | ||
29 | <conversionPattern value="%date %-5level - %logger %message%newline" /> | ||
30 | </layout> | ||
31 | </appender> | ||
32 | |||
33 | <root> | ||
34 | <level value="ALL" /> | ||
35 | <appender-ref ref="LogForwarder" /> | ||
36 | <appender-ref ref="LogFileAppender" /> | ||
37 | <appender-ref ref="TraceWriter" /> | ||
38 | </root> | ||
39 | </log4net> | ||
40 | </configuration> \ No newline at end of file | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs new file mode 100644 index 0000000..2c6ac31 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor.cs | |||
@@ -0,0 +1,247 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections; | ||
29 | using System.Diagnostics; | ||
30 | using System.IO; | ||
31 | using System.Reflection; | ||
32 | using System.Text; | ||
33 | using System.Threading; | ||
34 | using log4net; | ||
35 | |||
36 | namespace OpenSim.GridLaunch | ||
37 | { | ||
38 | internal partial class AppExecutor : IDisposable | ||
39 | { | ||
40 | // How long to wait for process to shut down by itself | ||
41 | private static readonly int shutdownWaitSeconds = 10; | ||
42 | |||
43 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
44 | |||
45 | //private StreamWriter Input { get { return process.StandardInput; } } | ||
46 | //private StreamReader Output { get { return process.StandardOutput; } } | ||
47 | //private StreamReader Error { get { return process.StandardError; } } | ||
48 | |||
49 | private StreamWriter Input { get; set; } | ||
50 | private StreamReader Output { get; set; } | ||
51 | private StreamReader Error { get; set; } | ||
52 | |||
53 | private object processLock = new object(); | ||
54 | |||
55 | private bool isRunning = false; | ||
56 | public bool IsRunning { get { return isRunning; } } | ||
57 | |||
58 | private string file; | ||
59 | public string File { get { return file; } } | ||
60 | |||
61 | Process process; | ||
62 | |||
63 | public AppExecutor(string File) | ||
64 | { | ||
65 | file = File; | ||
66 | } | ||
67 | |||
68 | #region Dispose of unmanaged resources | ||
69 | ~AppExecutor() | ||
70 | { | ||
71 | Dispose(); | ||
72 | } | ||
73 | private bool isDisposed = false; | ||
74 | public void Dispose() | ||
75 | { | ||
76 | if (!isDisposed) | ||
77 | { | ||
78 | isDisposed = true; | ||
79 | Stop(); | ||
80 | } | ||
81 | } | ||
82 | #endregion | ||
83 | |||
84 | #region Start / Stop process | ||
85 | public void Start() | ||
86 | { | ||
87 | if (isDisposed) | ||
88 | throw new ApplicationException("Attempt to start process in Disposed instance of AppExecutor."); | ||
89 | // Stop before starting | ||
90 | Stop(); | ||
91 | |||
92 | lock (processLock) | ||
93 | { | ||
94 | isRunning = true; | ||
95 | |||
96 | m_log.InfoFormat("Starting \"{0}\".", file); | ||
97 | |||
98 | // Start the process | ||
99 | process = new Process(); | ||
100 | process.StartInfo.FileName = file; | ||
101 | process.StartInfo.Arguments = ""; | ||
102 | process.StartInfo.CreateNoWindow = true; | ||
103 | process.StartInfo.UseShellExecute = false; | ||
104 | process.StartInfo.ErrorDialog = false; | ||
105 | process.EnableRaisingEvents = true; | ||
106 | |||
107 | |||
108 | // Redirect all standard input/output/errors | ||
109 | process.StartInfo.RedirectStandardInput = true; | ||
110 | process.StartInfo.RedirectStandardOutput = true; | ||
111 | process.StartInfo.RedirectStandardError = true; | ||
112 | |||
113 | // Start process | ||
114 | process.Start(); | ||
115 | |||
116 | Input = process.StandardInput; | ||
117 | Output = process.StandardOutput; | ||
118 | Error = process.StandardError; | ||
119 | |||
120 | // Start data copying | ||
121 | timer_Start(); | ||
122 | |||
123 | // We will flush manually | ||
124 | //Input.AutoFlush = false; | ||
125 | |||
126 | } | ||
127 | } | ||
128 | |||
129 | public void Stop() | ||
130 | { | ||
131 | // Shut down process | ||
132 | // We will ignore some exceptions here, against good programming practice... :) | ||
133 | |||
134 | lock (processLock) | ||
135 | { | ||
136 | // Running? | ||
137 | if (!isRunning) | ||
138 | return; | ||
139 | isRunning = false; | ||
140 | |||
141 | timer_Stop(); | ||
142 | |||
143 | m_log.InfoFormat("Stopping \"{0}\".", file); | ||
144 | |||
145 | // Send exit command to console | ||
146 | try | ||
147 | { | ||
148 | if (Input != null) | ||
149 | { | ||
150 | _writeLine(""); | ||
151 | _writeLine("exit"); | ||
152 | _writeLine("quit"); | ||
153 | // Wait for process to exit | ||
154 | process.WaitForExit(1000 * shutdownWaitSeconds); | ||
155 | } | ||
156 | } | ||
157 | catch (Exception ex) | ||
158 | { | ||
159 | m_log.ErrorFormat("Exeption asking \"{0}\" to shut down: {1}", file, ex.ToString()); | ||
160 | } | ||
161 | |||
162 | try | ||
163 | { | ||
164 | // Forcefully kill it | ||
165 | if (process.HasExited != true) | ||
166 | process.Kill(); | ||
167 | } | ||
168 | catch (Exception ex) | ||
169 | { | ||
170 | m_log.ErrorFormat("Exeption killing \"{0}\": {1}", file, ex.ToString()); | ||
171 | } | ||
172 | |||
173 | try | ||
174 | { | ||
175 | // Free resources | ||
176 | process.Close(); | ||
177 | } | ||
178 | catch (Exception ex) | ||
179 | { | ||
180 | m_log.ErrorFormat("Exeption freeing resources for \"{0}\": {1}", file, ex.ToString()); | ||
181 | } | ||
182 | |||
183 | // Dispose of stream and process object | ||
184 | //SafeDisposeOf(Input); | ||
185 | //SafeDisposeOf(Output); | ||
186 | //SafeDisposeOf(Error); | ||
187 | Program.SafeDisposeOf(process); | ||
188 | } | ||
189 | |||
190 | // Done stopping process | ||
191 | } | ||
192 | |||
193 | #endregion | ||
194 | |||
195 | #region Write to stdInput | ||
196 | public void Write(string Text) | ||
197 | { | ||
198 | // Lock so process won't shut down while we write, and that we won't write while proc is shutting down | ||
199 | lock (processLock) | ||
200 | { | ||
201 | _write(Text); | ||
202 | } | ||
203 | } | ||
204 | public void _write(string Text) | ||
205 | { | ||
206 | if (Input != null) | ||
207 | { | ||
208 | try | ||
209 | { | ||
210 | Input.Write(Text); | ||
211 | Input.Flush(); | ||
212 | } | ||
213 | catch (Exception ex) | ||
214 | { | ||
215 | m_log.ErrorFormat("Exeption sending text \"{0}\" to \"{1}\": {2}", file, Text, ex.ToString()); | ||
216 | } | ||
217 | |||
218 | } | ||
219 | } | ||
220 | public void WriteLine(string Text) | ||
221 | { | ||
222 | // Lock so process won't shut down while we write, and that we won't write while proc is shutting down | ||
223 | lock (processLock) | ||
224 | { | ||
225 | _writeLine(Text); | ||
226 | } | ||
227 | } | ||
228 | public void _writeLine(string Text) | ||
229 | { | ||
230 | if (Input != null) | ||
231 | { | ||
232 | try | ||
233 | { | ||
234 | m_log.DebugFormat("\"{0}\": Sending: \"{1}\"", file, Text); | ||
235 | Input.WriteLine(Text); | ||
236 | Input.Flush(); | ||
237 | } | ||
238 | catch (Exception ex) | ||
239 | { | ||
240 | m_log.ErrorFormat("Exeption sending text \"{0}\" to \"{1}\": {2}", file, Text, ex.ToString()); | ||
241 | } | ||
242 | } | ||
243 | } | ||
244 | #endregion | ||
245 | |||
246 | } | ||
247 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs new file mode 100644 index 0000000..0d07226 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_AsyncIO.cs | |||
@@ -0,0 +1,85 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.IO; | ||
30 | using System.Text; | ||
31 | |||
32 | namespace OpenSim.GridLaunch | ||
33 | { | ||
34 | internal partial class AppExecutor | ||
35 | { | ||
36 | |||
37 | |||
38 | #region Start / Stop timer thread | ||
39 | private void timer_Start() | ||
40 | { | ||
41 | asyncReadOutput(); | ||
42 | asyncReadError(); | ||
43 | } | ||
44 | |||
45 | private bool running = true; | ||
46 | private void timer_Stop() | ||
47 | { | ||
48 | running = false; | ||
49 | } | ||
50 | #endregion | ||
51 | |||
52 | private byte[] readBufferOutput = new byte[4096]; | ||
53 | private byte[] readBufferError = new byte[4096]; | ||
54 | |||
55 | private void asyncReadOutput() | ||
56 | { | ||
57 | if (running) | ||
58 | Output.BaseStream.BeginRead(readBufferOutput, 0, readBufferOutput.Length, asyncReadCallBackOutput, null); | ||
59 | } | ||
60 | private void asyncReadError() | ||
61 | { | ||
62 | if (running) | ||
63 | Error.BaseStream.BeginRead(readBufferError, 0, readBufferError.Length, asyncReadCallBackError, null); | ||
64 | } | ||
65 | |||
66 | private void asyncReadCallBackOutput(IAsyncResult ar) | ||
67 | { | ||
68 | int len = Output.BaseStream.EndRead(ar); | ||
69 | Program.FireAppConsoleOutput(file, | ||
70 | System.Text.Encoding.ASCII.GetString(readBufferOutput, 0, len) | ||
71 | ); | ||
72 | |||
73 | asyncReadOutput(); | ||
74 | } | ||
75 | private void asyncReadCallBackError(IAsyncResult ar) | ||
76 | { | ||
77 | int len = Error.BaseStream.EndRead(ar); | ||
78 | Program.FireAppConsoleError(file, | ||
79 | System.Text.Encoding.ASCII.GetString(readBufferError, 0, len) | ||
80 | ); | ||
81 | |||
82 | asyncReadError(); | ||
83 | } | ||
84 | } | ||
85 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs new file mode 100644 index 0000000..cd160f8 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/AppExecutor_Thread.cs | |||
@@ -0,0 +1,187 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | //using System; | ||
28 | //using System.Collections; | ||
29 | //using System.Collections.Generic; | ||
30 | //using System.Reflection; | ||
31 | //using System.Text; | ||
32 | //using System.Threading; | ||
33 | //using log4net; | ||
34 | |||
35 | //namespace OpenSim.GridLaunch | ||
36 | //{ | ||
37 | // internal class AppExecutor2 | ||
38 | // { | ||
39 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
40 | // private static readonly int consoleReadIntervalMilliseconds = 50; | ||
41 | // //private static readonly Timer readTimer = new Timer(readConsole, null, Timeout.Infinite, Timeout.Infinite); | ||
42 | // private static Thread timerThread; | ||
43 | // private static object timerThreadLock = new object(); | ||
44 | |||
45 | // #region Start / Stop timer thread | ||
46 | // private static void timer_Start() | ||
47 | // { | ||
48 | // //readTimer.Change(0, consoleReadIntervalMilliseconds); | ||
49 | // lock (timerThreadLock) | ||
50 | // { | ||
51 | // if (timerThread == null) | ||
52 | // { | ||
53 | // m_log.Debug("Starting timer thread."); | ||
54 | // timerThread = new Thread(timerThreadLoop); | ||
55 | // timerThread.Name = "StdOutputStdErrorReadThread"; | ||
56 | // timerThread.IsBackground = true; | ||
57 | // timerThread.Start(); | ||
58 | // } | ||
59 | // } | ||
60 | // } | ||
61 | // private static void timer_Stop() | ||
62 | // { | ||
63 | // //readTimer.Change(Timeout.Infinite, Timeout.Infinite); | ||
64 | // lock (timerThreadLock) | ||
65 | // { | ||
66 | // if (timerThread != null) | ||
67 | // { | ||
68 | // m_log.Debug("Stopping timer thread."); | ||
69 | // try | ||
70 | // { | ||
71 | // if (timerThread.IsAlive) | ||
72 | // timerThread.Abort(); | ||
73 | // timerThread.Join(2000); | ||
74 | // timerThread = null; | ||
75 | // } | ||
76 | // catch (Exception ex) | ||
77 | // { | ||
78 | // m_log.Error("Exception stopping timer thread: " + ex.ToString()); | ||
79 | // } | ||
80 | // } | ||
81 | // } | ||
82 | // } | ||
83 | // #endregion | ||
84 | |||
85 | // #region Timer read from consoles and fire event | ||
86 | |||
87 | // private static void timerThreadLoop() | ||
88 | // { | ||
89 | // try | ||
90 | // { | ||
91 | // while (true) | ||
92 | // { | ||
93 | // readConsole(); | ||
94 | // Thread.Sleep(consoleReadIntervalMilliseconds); | ||
95 | // } | ||
96 | // } | ||
97 | // catch (ThreadAbortException) { } // Expected on thread shutdown | ||
98 | // } | ||
99 | |||
100 | // private static void readConsole() | ||
101 | // { | ||
102 | // try | ||
103 | // { | ||
104 | |||
105 | // // Lock so we don't collide with any startup or shutdown | ||
106 | // lock (Program.AppList) | ||
107 | // { | ||
108 | // foreach (AppExecutor app in new ArrayList(Program.AppList.Values)) | ||
109 | // { | ||
110 | // try | ||
111 | // { | ||
112 | // string txt = app.GetStdOutput(); | ||
113 | // // Fire event with received text | ||
114 | // if (!string.IsNullOrEmpty(txt)) | ||
115 | // Program.FireAppConsoleOutput(app.File, txt); | ||
116 | // } | ||
117 | // catch (Exception ex) | ||
118 | // { | ||
119 | // m_log.ErrorFormat("Exception reading standard output from \"{0}\": {1}", app.File, ex.ToString()); | ||
120 | // } | ||
121 | // try | ||
122 | // { | ||
123 | // string txt = app.GetStdError(); | ||
124 | // // Fire event with received text | ||
125 | // if (!string.IsNullOrEmpty(txt)) | ||
126 | // Program.FireAppConsoleOutput(app.File, txt); | ||
127 | // } | ||
128 | // catch (Exception ex) | ||
129 | // { | ||
130 | // m_log.ErrorFormat("Exception reading standard error from \"{0}\": {1}", app.File, ex.ToString()); | ||
131 | // } | ||
132 | // } | ||
133 | // } | ||
134 | // } | ||
135 | // finally | ||
136 | // { | ||
137 | // } | ||
138 | // } | ||
139 | // #endregion | ||
140 | |||
141 | |||
142 | // #region Read stdOutput and stdError | ||
143 | // public string GetStdOutput() | ||
144 | // { | ||
145 | // return GetStreamData(Output); | ||
146 | // } | ||
147 | // public string GetStdError() | ||
148 | // { | ||
149 | // return GetStreamData(Error); | ||
150 | // } | ||
151 | |||
152 | // private static int num = 0; | ||
153 | // // Gets any data from StreamReader object, non-blocking | ||
154 | // private static string GetStreamData(StreamReader sr) | ||
155 | // { | ||
156 | // // Can't read? | ||
157 | // if (!sr.BaseStream.CanRead) | ||
158 | // return ""; | ||
159 | |||
160 | // // Read a chunk | ||
161 | // //sr.BaseStream.ReadTimeout = 100; | ||
162 | // byte[] buffer = new byte[4096]; | ||
163 | // num++; | ||
164 | // Trace.WriteLine("Start read " + num); | ||
165 | // int len = sr.BaseStream.Read(buffer, 0, buffer.Length); | ||
166 | // Trace.WriteLine("End read " + num + ": " + len); | ||
167 | |||
168 | // // Nothing? | ||
169 | // if (len <= 0) | ||
170 | // return ""; | ||
171 | |||
172 | // // Return data | ||
173 | // StringBuilder sb = new StringBuilder(); | ||
174 | // sb.Append(System.Text.Encoding.ASCII.GetString(buffer, 0, len)); | ||
175 | |||
176 | // //while (sr.Peek() >= 0) | ||
177 | // //{ | ||
178 | // // sb.Append(Convert.ToChar(sr.Read())); | ||
179 | // //} | ||
180 | |||
181 | // return sb.ToString(); | ||
182 | // } | ||
183 | // #endregion | ||
184 | |||
185 | |||
186 | // } | ||
187 | //} | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs b/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs new file mode 100644 index 0000000..aca36e9 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/CommandProcessor.cs | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Text; | ||
30 | |||
31 | namespace OpenSim.GridLaunch | ||
32 | { | ||
33 | internal class CommandProcessor | ||
34 | { | ||
35 | public delegate void CommandLineDelegate(string application, string command, string arguments); | ||
36 | public event CommandLineDelegate CommandLine; | ||
37 | |||
38 | public bool IsCommand(string cmd) | ||
39 | { | ||
40 | if (cmd.Trim().StartsWith("/")) | ||
41 | return true; | ||
42 | return false; | ||
43 | } | ||
44 | |||
45 | public static readonly char[] cmdSplit = new char[] { ' ' }; | ||
46 | public bool Process(string app, string command) | ||
47 | { | ||
48 | // Only process commands | ||
49 | if (!IsCommand(command)) | ||
50 | return false; | ||
51 | |||
52 | // Remove first / | ||
53 | command = command.Trim().Remove(0, 1); | ||
54 | |||
55 | // Split cmd and args | ||
56 | string[] carg = command.Split(cmdSplit, 2); | ||
57 | if (carg.Length == 0) | ||
58 | return true; | ||
59 | |||
60 | string cmd = carg[0]; // Command | ||
61 | string arg = ""; | ||
62 | if (carg.Length > 1) | ||
63 | arg = carg[1]; // Arguments | ||
64 | |||
65 | // Do we have a command? | ||
66 | if (string.IsNullOrEmpty(cmd)) | ||
67 | return true; | ||
68 | |||
69 | // All is fine | ||
70 | if (CommandLine != null) | ||
71 | CommandLine(app, cmd, arg); | ||
72 | return true; | ||
73 | } | ||
74 | |||
75 | } | ||
76 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs new file mode 100644 index 0000000..a04c9cf --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Console/Console.cs | |||
@@ -0,0 +1,122 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Text; | ||
30 | |||
31 | namespace OpenSim.GridLaunch.GUI.Console | ||
32 | { | ||
33 | internal class Console: IGUI | ||
34 | { | ||
35 | private List<string> Apps = new List<string>(); | ||
36 | public Console () | ||
37 | { | ||
38 | Program.AppCreated += Program_AppCreated; | ||
39 | Program.AppRemoved += Program_AppRemoved; | ||
40 | Program.AppConsoleOutput += Program_AppConsoleOutput; | ||
41 | Program.Command.CommandLine += Command_CommandLine; | ||
42 | } | ||
43 | |||
44 | private string currentApp = ""; | ||
45 | private bool quitTyped = false; | ||
46 | void Command_CommandLine(string application, string command, string arguments) | ||
47 | { | ||
48 | |||
49 | // If command is a number then someone might be trying to change console: /1, /2, etc. | ||
50 | int currentAppNum = 0; | ||
51 | if (int.TryParse(command, out currentAppNum)) | ||
52 | if (currentAppNum <= Apps.Count) | ||
53 | { | ||
54 | currentApp = Apps[currentAppNum - 1]; | ||
55 | System.Console.WriteLine("Changed console to app: " + currentApp); | ||
56 | } else | ||
57 | System.Console.WriteLine("Unable to change to app number: " + currentAppNum); | ||
58 | |||
59 | // Has user typed quit? | ||
60 | if (command.ToLower() == "quit") | ||
61 | quitTyped = true; | ||
62 | |||
63 | // Has user typed /list? | ||
64 | if (command.ToLower() == "list") | ||
65 | { | ||
66 | System.Console.WriteLine("/0 Log console"); | ||
67 | for (int i = 1; i <= Apps.Count; i++) | ||
68 | { | ||
69 | System.Console.WriteLine(string.Format("/{0} {1}", i, Apps[i - 1])); | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | #region Module Start / Stop | ||
74 | public void StartGUI() | ||
75 | { | ||
76 | // Console start | ||
77 | System.Console.WriteLine("Console GUI"); | ||
78 | System.Console.WriteLine("Use commands /0, /1, /2, etc to switch between applications."); | ||
79 | System.Console.WriteLine("Type /list for list of applications."); | ||
80 | System.Console.WriteLine("Anything that doesn't start with a / will be sent to selected application"); | ||
81 | System.Console.WriteLine("type /quit to exit"); | ||
82 | |||
83 | |||
84 | while (quitTyped == false) | ||
85 | { | ||
86 | string line = System.Console.ReadLine().TrimEnd("\r\n".ToCharArray()); | ||
87 | Program.Write(currentApp, line); | ||
88 | } | ||
89 | // We are done | ||
90 | System.Console.WriteLine("Console exit."); | ||
91 | } | ||
92 | |||
93 | public void StopGUI() | ||
94 | { | ||
95 | // Console stop | ||
96 | } | ||
97 | #endregion | ||
98 | |||
99 | #region GridLaunch Events | ||
100 | void Program_AppCreated(string App) | ||
101 | { | ||
102 | System.Console.WriteLine("Started: " + App); | ||
103 | if (!Apps.Contains(App)) | ||
104 | Apps.Add(App); | ||
105 | } | ||
106 | |||
107 | void Program_AppRemoved(string App) | ||
108 | { | ||
109 | System.Console.WriteLine("Stopped: " + App); | ||
110 | if (Apps.Contains(App)) | ||
111 | Apps.Remove(App); | ||
112 | } | ||
113 | |||
114 | void Program_AppConsoleOutput(string App, string Text) | ||
115 | { | ||
116 | System.Console.Write(App + ": " + Text); | ||
117 | } | ||
118 | #endregion | ||
119 | |||
120 | |||
121 | } | ||
122 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs new file mode 100644 index 0000000..45d8af7 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/IGUI.cs | |||
@@ -0,0 +1,12 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Text; | ||
4 | |||
5 | namespace OpenSim.GridLaunch.GUI | ||
6 | { | ||
7 | public interface IGUI | ||
8 | { | ||
9 | void StartGUI(); | ||
10 | void StopGUI(); | ||
11 | } | ||
12 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs new file mode 100644 index 0000000..19b27e4 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/Client.cs | |||
@@ -0,0 +1,113 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Net.Sockets; | ||
30 | using System.Text; | ||
31 | using System.Text.RegularExpressions; | ||
32 | |||
33 | namespace OpenSim.GridLaunch.GUI.Network | ||
34 | { | ||
35 | internal class Client | ||
36 | { | ||
37 | public TcpClient tcpClient; | ||
38 | private byte[] readBuffer = new byte[4096]; | ||
39 | private byte[] writeBuffer; | ||
40 | private TCPD tcp; | ||
41 | private string inputData = ""; | ||
42 | private object inputDataLock = new object(); | ||
43 | public Client(TCPD _tcp, TcpClient Client) | ||
44 | { | ||
45 | tcp = _tcp; | ||
46 | tcpClient = Client; | ||
47 | asyncReadStart(); | ||
48 | Write("OpenSim TCP Console GUI"); | ||
49 | Write("Use commands /0, /1, /2, etc to switch between applications."); | ||
50 | Write("Type /list for list of applications."); | ||
51 | Write("Anything that doesn't start with a / will be sent to selected application"); | ||
52 | Write("type /quit to exit"); | ||
53 | |||
54 | } | ||
55 | |||
56 | private void asyncReadStart() | ||
57 | { | ||
58 | tcpClient.GetStream().BeginRead(readBuffer, 0, readBuffer.Length, asyncReadCallBack, null); | ||
59 | } | ||
60 | |||
61 | //private Regex LineExtractor = new Regex("^(.*)$") | ||
62 | private void asyncReadCallBack(IAsyncResult ar) | ||
63 | { | ||
64 | try | ||
65 | { | ||
66 | // Read data | ||
67 | int len = tcpClient.GetStream().EndRead(ar); | ||
68 | |||
69 | // Send it to app | ||
70 | string newData = System.Text.Encoding.ASCII.GetString(readBuffer, 0, len); | ||
71 | //lock (inputDataLock) | ||
72 | //{ | ||
73 | inputData += newData; | ||
74 | if (newData.Contains("\n")) | ||
75 | SendInputLines(); | ||
76 | //} | ||
77 | |||
78 | // Start it again | ||
79 | asyncReadStart(); | ||
80 | } | ||
81 | catch | ||
82 | { | ||
83 | // TODO: Remove client when we get exception | ||
84 | // Temp patch: if exception we don't call asyncReadStart() | ||
85 | } | ||
86 | } | ||
87 | |||
88 | private void SendInputLines() | ||
89 | { | ||
90 | StringBuilder line = new StringBuilder(); | ||
91 | foreach (char c in inputData) | ||
92 | { | ||
93 | if (c == 13) | ||
94 | continue; | ||
95 | if (c == 10) | ||
96 | { | ||
97 | Program.WriteLine(tcp.currentApp, line.ToString()); | ||
98 | line = new StringBuilder(); | ||
99 | continue; | ||
100 | } | ||
101 | line.Append(c); | ||
102 | } | ||
103 | // We'll keep whatever is left over | ||
104 | inputData = line.ToString(); | ||
105 | } | ||
106 | |||
107 | public void Write(string Text) | ||
108 | { | ||
109 | writeBuffer = Encoding.ASCII.GetBytes(Text); | ||
110 | tcpClient.GetStream().Write(writeBuffer, 0, writeBuffer.Length); | ||
111 | } | ||
112 | } | ||
113 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs new file mode 100644 index 0000000..5524e21 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Network/TCPD.cs | |||
@@ -0,0 +1,231 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Net.Sockets; | ||
32 | using System.Reflection; | ||
33 | using System.Text; | ||
34 | using System.Threading; | ||
35 | using log4net; | ||
36 | |||
37 | namespace OpenSim.GridLaunch.GUI.Network | ||
38 | { | ||
39 | public class TCPD : IGUI, IDisposable | ||
40 | { | ||
41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
42 | private List<Client> Clients = new List<Client>(); | ||
43 | |||
44 | private readonly int defaultPort = 7998; | ||
45 | private TcpListener tcpListener; | ||
46 | private Thread listenThread; | ||
47 | private Thread clientThread; | ||
48 | |||
49 | |||
50 | private List<string> Apps = new List<string>(); | ||
51 | internal string currentApp = ""; | ||
52 | private bool quitTyped = false; | ||
53 | |||
54 | public TCPD() | ||
55 | { | ||
56 | Program.AppCreated += Program_AppCreated; | ||
57 | Program.AppRemoved += Program_AppRemoved; | ||
58 | Program.AppConsoleOutput += Program_AppConsoleOutput; | ||
59 | Program.Command.CommandLine += Command_CommandLine; | ||
60 | |||
61 | } | ||
62 | |||
63 | ~TCPD() | ||
64 | { | ||
65 | Dispose(); | ||
66 | } | ||
67 | private bool isDisposed = false; | ||
68 | ///<summary> | ||
69 | ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. | ||
70 | ///</summary> | ||
71 | ///<filterpriority>2</filterpriority> | ||
72 | public void Dispose() | ||
73 | { | ||
74 | if (isDisposed) | ||
75 | return; | ||
76 | isDisposed = true; | ||
77 | tcpd_Stop(); | ||
78 | } | ||
79 | |||
80 | public void StartGUI() | ||
81 | { | ||
82 | // We are starting | ||
83 | tcpd_Start(); | ||
84 | } | ||
85 | |||
86 | public void StopGUI() | ||
87 | { | ||
88 | // We are stopping | ||
89 | tcpd_Stop(); | ||
90 | } | ||
91 | |||
92 | |||
93 | #region GridLaunch Events | ||
94 | private void Command_CommandLine(string application, string command, string arguments) | ||
95 | { | ||
96 | // If command is a number then someone might be trying to change console: /1, /2, etc. | ||
97 | int currentAppNum = 0; | ||
98 | if (int.TryParse(command, out currentAppNum)) | ||
99 | if (currentAppNum <= Apps.Count) | ||
100 | { | ||
101 | currentApp = Apps[currentAppNum - 1]; | ||
102 | TCPWriteToAll("Changed console to app: " + currentApp + Environment.NewLine); | ||
103 | } | ||
104 | else | ||
105 | TCPWriteToAll("Unable to change to app number: " + currentAppNum + Environment.NewLine); | ||
106 | |||
107 | // Has user typed quit? | ||
108 | if (command.ToLower() == "quit") | ||
109 | quitTyped = true; | ||
110 | |||
111 | // Has user typed /list? | ||
112 | if (command.ToLower() == "list") | ||
113 | { | ||
114 | TCPWriteToAll("/0 Log console"); | ||
115 | for (int i = 1; i <= Apps.Count; i++) | ||
116 | { | ||
117 | TCPWriteToAll(string.Format("/{0} {1}", i, Apps[i - 1])); | ||
118 | } | ||
119 | } | ||
120 | |||
121 | } | ||
122 | |||
123 | void Program_AppCreated(string App) | ||
124 | { | ||
125 | TCPWriteToAll("Started: " + App); | ||
126 | if (!Apps.Contains(App)) | ||
127 | Apps.Add(App); | ||
128 | } | ||
129 | |||
130 | void Program_AppRemoved(string App) | ||
131 | { | ||
132 | TCPWriteToAll("Stopped: " + App); | ||
133 | if (Apps.Contains(App)) | ||
134 | Apps.Remove(App); | ||
135 | } | ||
136 | |||
137 | private void Program_AppConsoleOutput(string App, string Text) | ||
138 | { | ||
139 | TCPWriteToAll(App, Text); | ||
140 | } | ||
141 | |||
142 | #endregion | ||
143 | |||
144 | private void tcpd_Start() | ||
145 | { | ||
146 | listenThread = new Thread(new ThreadStart(ListenForClients)); | ||
147 | listenThread.Name = "TCPDThread"; | ||
148 | listenThread.IsBackground = true; | ||
149 | listenThread.Start(); | ||
150 | |||
151 | while (!quitTyped) | ||
152 | { | ||
153 | Thread.Sleep(500); | ||
154 | } | ||
155 | |||
156 | //clientThread = new Thread(new ThreadStart(ProcessClients)); | ||
157 | //clientThread.Name = "TCPClientThread"; | ||
158 | //clientThread.IsBackground = true; | ||
159 | ////clientThread.Start(); | ||
160 | |||
161 | } | ||
162 | private void tcpd_Stop() | ||
163 | { | ||
164 | StopThread(listenThread); | ||
165 | StopThread(clientThread); | ||
166 | } | ||
167 | private void ListenForClients() | ||
168 | { | ||
169 | int Port = 0; | ||
170 | int.TryParse(Program.Settings["TCPPort"], out Port); | ||
171 | if (Port < 1) | ||
172 | Port = defaultPort; | ||
173 | |||
174 | m_log.Info("Starting TCP Server on port " + Port); | ||
175 | this.tcpListener = new TcpListener(IPAddress.Any, Port); | ||
176 | |||
177 | this.tcpListener.Start(); | ||
178 | |||
179 | while (true) | ||
180 | { | ||
181 | // Blocks until a client has connected to the server | ||
182 | TcpClient tcpClient = this.tcpListener.AcceptTcpClient(); | ||
183 | Client client = new Client(this, tcpClient); | ||
184 | |||
185 | lock (Clients) | ||
186 | { | ||
187 | Clients.Add(client); | ||
188 | } | ||
189 | System.Threading.Thread.Sleep(500); | ||
190 | } | ||
191 | } | ||
192 | |||
193 | private static void StopThread(Thread t) | ||
194 | { | ||
195 | if (t != null) | ||
196 | { | ||
197 | m_log.Debug("Stopping thread " + t.Name); | ||
198 | try | ||
199 | { | ||
200 | if (t.IsAlive) | ||
201 | t.Abort(); | ||
202 | t.Join(2000); | ||
203 | t = null; | ||
204 | } | ||
205 | catch (Exception ex) | ||
206 | { | ||
207 | m_log.Error("Exception stopping thread: " + ex.ToString()); | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | private void TCPWriteToAll(string app, string text) | ||
213 | { | ||
214 | TCPWriteToAll(text); | ||
215 | } | ||
216 | private void TCPWriteToAll(string text) | ||
217 | { | ||
218 | foreach (Client c in new ArrayList(Clients)) | ||
219 | { | ||
220 | try | ||
221 | { | ||
222 | c.Write(text); | ||
223 | } catch (Exception ex) | ||
224 | { | ||
225 | m_log.Error("Exception writing to TCP: " + ex.ToString()); | ||
226 | } | ||
227 | } | ||
228 | } | ||
229 | |||
230 | } | ||
231 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs new file mode 100644 index 0000000..c6fd501 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/Service/Service.cs | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.ServiceProcess; | ||
30 | using System.Text; | ||
31 | using OpenSim.GridLaunch.GUI; | ||
32 | |||
33 | namespace OpenSim.GridLaunch | ||
34 | { | ||
35 | internal class Service: ServiceBase, IGUI | ||
36 | { | ||
37 | private ServiceBase[] ServicesToRun; | ||
38 | public Service() | ||
39 | { | ||
40 | ServicesToRun = new ServiceBase[] {this}; | ||
41 | } | ||
42 | |||
43 | public void StartGUI() | ||
44 | { | ||
45 | ServiceBase.Run(ServicesToRun); | ||
46 | } | ||
47 | |||
48 | public void StopGUI() | ||
49 | { | ||
50 | // Nothing | ||
51 | } | ||
52 | |||
53 | protected override void OnStart(string[] args) | ||
54 | { | ||
55 | // Command line arguments override settings | ||
56 | Program.Settings.ParseCommandArguments(args); | ||
57 | } | ||
58 | |||
59 | protected override void OnStop() | ||
60 | { | ||
61 | Program.Shutdown(); | ||
62 | } | ||
63 | |||
64 | } | ||
65 | } \ 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 new file mode 100644 index 0000000..b3594b6 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Bottom Border.png | |||
Binary files differ | |||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png new file mode 100644 index 0000000..8b03281 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim Right Border.png | |||
Binary files differ | |||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim.png b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim.png new file mode 100644 index 0000000..257ca39 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/OpenSim.png | |||
Binary files differ | |||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs new file mode 100644 index 0000000..1498791 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.Designer.cs | |||
@@ -0,0 +1,224 @@ | |||
1 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
2 | { | ||
3 | partial class ProcessPanel | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Required designer variable. | ||
7 | /// </summary> | ||
8 | private System.ComponentModel.IContainer components = null; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Clean up any resources being used. | ||
12 | /// </summary> | ||
13 | /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||
14 | protected override void Dispose(bool disposing) | ||
15 | { | ||
16 | if (disposing && (components != null)) | ||
17 | { | ||
18 | components.Dispose(); | ||
19 | } | ||
20 | base.Dispose(disposing); | ||
21 | } | ||
22 | |||
23 | #region Windows Form Designer generated code | ||
24 | |||
25 | /// <summary> | ||
26 | /// Required method for Designer support - do not modify | ||
27 | /// the contents of this method with the code editor. | ||
28 | /// </summary> | ||
29 | private void InitializeComponent() | ||
30 | { | ||
31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProcessPanel)); | ||
32 | this.tabControl1 = new System.Windows.Forms.TabControl(); | ||
33 | this.tabLogs = new System.Windows.Forms.TabPage(); | ||
34 | this.btnShutdown = new System.Windows.Forms.Button(); | ||
35 | this.pictureBox2 = new System.Windows.Forms.PictureBox(); | ||
36 | this.pictureBox1 = new System.Windows.Forms.PictureBox(); | ||
37 | this.pictureBox3 = new System.Windows.Forms.PictureBox(); | ||
38 | this.tabSettings = new System.Windows.Forms.TabPage(); | ||
39 | this.cblStartupComponents = new System.Windows.Forms.CheckedListBox(); | ||
40 | this.gbStartupComponents = new System.Windows.Forms.GroupBox(); | ||
41 | this.btnSave = new System.Windows.Forms.Button(); | ||
42 | this.ucLogWindow1 = new OpenSim.GridLaunch.GUI.WinForm.ucLogWindow(); | ||
43 | this.label1 = new System.Windows.Forms.Label(); | ||
44 | this.tabControl1.SuspendLayout(); | ||
45 | this.tabLogs.SuspendLayout(); | ||
46 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); | ||
47 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); | ||
48 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); | ||
49 | this.tabSettings.SuspendLayout(); | ||
50 | this.gbStartupComponents.SuspendLayout(); | ||
51 | this.SuspendLayout(); | ||
52 | // | ||
53 | // tabControl1 | ||
54 | // | ||
55 | this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | ||
56 | | System.Windows.Forms.AnchorStyles.Left) | ||
57 | | System.Windows.Forms.AnchorStyles.Right))); | ||
58 | this.tabControl1.Controls.Add(this.tabSettings); | ||
59 | this.tabControl1.Controls.Add(this.tabLogs); | ||
60 | this.tabControl1.Location = new System.Drawing.Point(-1, 123); | ||
61 | this.tabControl1.Name = "tabControl1"; | ||
62 | this.tabControl1.SelectedIndex = 0; | ||
63 | this.tabControl1.Size = new System.Drawing.Size(632, 275); | ||
64 | this.tabControl1.TabIndex = 0; | ||
65 | // | ||
66 | // tabLogs | ||
67 | // | ||
68 | this.tabLogs.Controls.Add(this.ucLogWindow1); | ||
69 | this.tabLogs.Location = new System.Drawing.Point(4, 22); | ||
70 | this.tabLogs.Name = "tabLogs"; | ||
71 | this.tabLogs.Padding = new System.Windows.Forms.Padding(3); | ||
72 | this.tabLogs.Size = new System.Drawing.Size(624, 249); | ||
73 | this.tabLogs.TabIndex = 0; | ||
74 | this.tabLogs.Text = "Logs"; | ||
75 | this.tabLogs.UseVisualStyleBackColor = true; | ||
76 | // | ||
77 | // btnShutdown | ||
78 | // | ||
79 | this.btnShutdown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); | ||
80 | this.btnShutdown.Location = new System.Drawing.Point(542, 400); | ||
81 | this.btnShutdown.Name = "btnShutdown"; | ||
82 | this.btnShutdown.Size = new System.Drawing.Size(75, 23); | ||
83 | this.btnShutdown.TabIndex = 1; | ||
84 | this.btnShutdown.Text = "Shutdown"; | ||
85 | this.btnShutdown.UseVisualStyleBackColor = true; | ||
86 | this.btnShutdown.Click += new System.EventHandler(this.btnShutdown_Click); | ||
87 | // | ||
88 | // pictureBox2 | ||
89 | // | ||
90 | this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | ||
91 | | System.Windows.Forms.AnchorStyles.Right))); | ||
92 | this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image"))); | ||
93 | this.pictureBox2.Location = new System.Drawing.Point(585, -1); | ||
94 | this.pictureBox2.Name = "pictureBox2"; | ||
95 | this.pictureBox2.Size = new System.Drawing.Size(46, 124); | ||
96 | this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; | ||
97 | this.pictureBox2.TabIndex = 3; | ||
98 | this.pictureBox2.TabStop = false; | ||
99 | // | ||
100 | // pictureBox1 | ||
101 | // | ||
102 | this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); | ||
103 | this.pictureBox1.Location = new System.Drawing.Point(-1, -1); | ||
104 | this.pictureBox1.Name = "pictureBox1"; | ||
105 | this.pictureBox1.Size = new System.Drawing.Size(586, 124); | ||
106 | this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; | ||
107 | this.pictureBox1.TabIndex = 2; | ||
108 | this.pictureBox1.TabStop = false; | ||
109 | // | ||
110 | // pictureBox3 | ||
111 | // | ||
112 | this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | ||
113 | | System.Windows.Forms.AnchorStyles.Left) | ||
114 | | System.Windows.Forms.AnchorStyles.Right))); | ||
115 | this.pictureBox3.Image = global::OpenSim.GridLaunch.Properties.Resources.OpenSim_Bottom_Border; | ||
116 | this.pictureBox3.Location = new System.Drawing.Point(-1, 120); | ||
117 | this.pictureBox3.Name = "pictureBox3"; | ||
118 | this.pictureBox3.Size = new System.Drawing.Size(632, 310); | ||
119 | this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; | ||
120 | this.pictureBox3.TabIndex = 4; | ||
121 | this.pictureBox3.TabStop = false; | ||
122 | // | ||
123 | // tabSettings | ||
124 | // | ||
125 | this.tabSettings.Controls.Add(this.label1); | ||
126 | this.tabSettings.Controls.Add(this.btnSave); | ||
127 | this.tabSettings.Controls.Add(this.gbStartupComponents); | ||
128 | this.tabSettings.Location = new System.Drawing.Point(4, 22); | ||
129 | this.tabSettings.Name = "tabSettings"; | ||
130 | this.tabSettings.Padding = new System.Windows.Forms.Padding(3); | ||
131 | this.tabSettings.Size = new System.Drawing.Size(624, 249); | ||
132 | this.tabSettings.TabIndex = 1; | ||
133 | this.tabSettings.Text = "Settings"; | ||
134 | this.tabSettings.UseVisualStyleBackColor = true; | ||
135 | // | ||
136 | // cblStartupComponents | ||
137 | // | ||
138 | this.cblStartupComponents.CheckOnClick = true; | ||
139 | this.cblStartupComponents.FormattingEnabled = true; | ||
140 | this.cblStartupComponents.Location = new System.Drawing.Point(6, 19); | ||
141 | this.cblStartupComponents.Name = "cblStartupComponents"; | ||
142 | this.cblStartupComponents.Size = new System.Drawing.Size(202, 109); | ||
143 | this.cblStartupComponents.TabIndex = 0; | ||
144 | // | ||
145 | // gbStartupComponents | ||
146 | // | ||
147 | this.gbStartupComponents.Controls.Add(this.cblStartupComponents); | ||
148 | this.gbStartupComponents.Location = new System.Drawing.Point(9, 6); | ||
149 | this.gbStartupComponents.Name = "gbStartupComponents"; | ||
150 | this.gbStartupComponents.Size = new System.Drawing.Size(214, 136); | ||
151 | this.gbStartupComponents.TabIndex = 1; | ||
152 | this.gbStartupComponents.TabStop = false; | ||
153 | this.gbStartupComponents.Text = "Startup components"; | ||
154 | // | ||
155 | // btnSave | ||
156 | // | ||
157 | this.btnSave.Location = new System.Drawing.Point(9, 148); | ||
158 | this.btnSave.Name = "btnSave"; | ||
159 | this.btnSave.Size = new System.Drawing.Size(92, 23); | ||
160 | this.btnSave.TabIndex = 2; | ||
161 | this.btnSave.Text = "Save settings"; | ||
162 | this.btnSave.UseVisualStyleBackColor = true; | ||
163 | this.btnSave.Click += new System.EventHandler(this.btnSave_Click); | ||
164 | // | ||
165 | // ucLogWindow1 | ||
166 | // | ||
167 | this.ucLogWindow1.Dock = System.Windows.Forms.DockStyle.Fill; | ||
168 | this.ucLogWindow1.Location = new System.Drawing.Point(3, 3); | ||
169 | this.ucLogWindow1.Name = "ucLogWindow1"; | ||
170 | this.ucLogWindow1.Size = new System.Drawing.Size(618, 243); | ||
171 | this.ucLogWindow1.TabIndex = 0; | ||
172 | // | ||
173 | // label1 | ||
174 | // | ||
175 | this.label1.AutoSize = true; | ||
176 | this.label1.Location = new System.Drawing.Point(108, 149); | ||
177 | this.label1.Name = "label1"; | ||
178 | this.label1.Size = new System.Drawing.Size(259, 13); | ||
179 | this.label1.TabIndex = 3; | ||
180 | this.label1.Text = "* You have to restart app before changes take effect."; | ||
181 | // | ||
182 | // ProcessPanel | ||
183 | // | ||
184 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); | ||
185 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||
186 | this.ClientSize = new System.Drawing.Size(629, 428); | ||
187 | this.Controls.Add(this.pictureBox2); | ||
188 | this.Controls.Add(this.pictureBox1); | ||
189 | this.Controls.Add(this.btnShutdown); | ||
190 | this.Controls.Add(this.tabControl1); | ||
191 | this.Controls.Add(this.pictureBox3); | ||
192 | this.Name = "ProcessPanel"; | ||
193 | this.Text = "OpenSim GUI alpha"; | ||
194 | this.Load += new System.EventHandler(this.ProcessPanel_Load); | ||
195 | this.tabControl1.ResumeLayout(false); | ||
196 | this.tabLogs.ResumeLayout(false); | ||
197 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); | ||
198 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); | ||
199 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); | ||
200 | this.tabSettings.ResumeLayout(false); | ||
201 | this.tabSettings.PerformLayout(); | ||
202 | this.gbStartupComponents.ResumeLayout(false); | ||
203 | this.ResumeLayout(false); | ||
204 | this.PerformLayout(); | ||
205 | |||
206 | } | ||
207 | |||
208 | #endregion | ||
209 | |||
210 | private System.Windows.Forms.TabControl tabControl1; | ||
211 | private System.Windows.Forms.TabPage tabLogs; | ||
212 | private System.Windows.Forms.Button btnShutdown; | ||
213 | private ucLogWindow ucLogWindow1; | ||
214 | private System.Windows.Forms.PictureBox pictureBox1; | ||
215 | private System.Windows.Forms.PictureBox pictureBox2; | ||
216 | private System.Windows.Forms.PictureBox pictureBox3; | ||
217 | private System.Windows.Forms.TabPage tabSettings; | ||
218 | private System.Windows.Forms.GroupBox gbStartupComponents; | ||
219 | private System.Windows.Forms.CheckedListBox cblStartupComponents; | ||
220 | private System.Windows.Forms.Button btnSave; | ||
221 | private System.Windows.Forms.Label label1; | ||
222 | |||
223 | } | ||
224 | } \ 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 new file mode 100644 index 0000000..dbf97d6 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.cs | |||
@@ -0,0 +1,288 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.ComponentModel; | ||
30 | using System.Data; | ||
31 | using System.Diagnostics; | ||
32 | using System.Drawing; | ||
33 | using System.Text; | ||
34 | using System.Windows.Forms; | ||
35 | |||
36 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
37 | { | ||
38 | public partial class ProcessPanel : Form, IGUI | ||
39 | { | ||
40 | public ProcessPanel() | ||
41 | { | ||
42 | Application.EnableVisualStyles(); | ||
43 | //Application.SetCompatibleTextRenderingDefault(false); | ||
44 | |||
45 | InitializeComponent(); | ||
46 | Program.AppCreated += Program_AppCreated; | ||
47 | Program.AppRemoved += Program_AppRemoved; | ||
48 | Program.AppConsoleOutput += Program_AppConsoleOutput; | ||
49 | Program.AppConsoleError += Program_AppConsoleError; | ||
50 | log4netAppender.LogLine += log4netAppender_LogLine; | ||
51 | } | ||
52 | |||
53 | #region Module Start / Stop | ||
54 | public void StartGUI() | ||
55 | { | ||
56 | Application.Run(this); | ||
57 | } | ||
58 | |||
59 | public void StopGUI() | ||
60 | { | ||
61 | this.Close(); | ||
62 | } | ||
63 | #endregion | ||
64 | |||
65 | #region Main log tab | ||
66 | void log4netAppender_LogLine(Color color, string LogText) | ||
67 | { | ||
68 | ucLogWindow1.Write(color, LogText); | ||
69 | } | ||
70 | #endregion | ||
71 | |||
72 | #region Form events | ||
73 | private void btnShutdown_Click(object sender, EventArgs e) | ||
74 | { | ||
75 | Program.Shutdown(); | ||
76 | } | ||
77 | #endregion | ||
78 | |||
79 | #region GridLaunch Events | ||
80 | public delegate void Program_AppCreatedDelegate(string App); | ||
81 | public void Program_AppCreated(string App) | ||
82 | { | ||
83 | if (this.InvokeRequired) { | ||
84 | this.Invoke(new Program_AppCreatedDelegate(Program_AppCreated), App); | ||
85 | return; | ||
86 | } | ||
87 | |||
88 | Trace.WriteLine("Start: " + App); | ||
89 | |||
90 | // Do we already have app window for that app? | ||
91 | if (AppWindow_Get(App) != null) | ||
92 | return; | ||
93 | |||
94 | // New log window | ||
95 | ucAppWindow aw = new ucAppWindow(); | ||
96 | // New tab page | ||
97 | TabPage tp = new TabPage(App); | ||
98 | // Add log window into tab page | ||
99 | tp.Controls.Add(aw); | ||
100 | // Add tab page into tab control | ||
101 | tabControl1.TabPages.Add(tp); | ||
102 | // Add it all to our internal list | ||
103 | AppWindow_Add(App, aw); | ||
104 | // Hook up events | ||
105 | aw.LineEntered += AppWindow_LineEntered; | ||
106 | |||
107 | // Fill log window fully inside tab page | ||
108 | aw.Dock = DockStyle.Fill; | ||
109 | } | ||
110 | |||
111 | |||
112 | public delegate void Program_AppRemovedDelegate(string App); | ||
113 | public void Program_AppRemoved(string App) | ||
114 | { | ||
115 | if (this.InvokeRequired) { | ||
116 | this.Invoke(new Program_AppRemovedDelegate(Program_AppRemoved), App); | ||
117 | return; | ||
118 | } | ||
119 | |||
120 | Trace.WriteLine("Stop: " + App); | ||
121 | |||
122 | // Get app window | ||
123 | ucAppWindow aw = AppWindow_Get(App); | ||
124 | if (aw == null) | ||
125 | return; | ||
126 | |||
127 | // Get its tab page | ||
128 | TabPage tp = aw.Parent as TabPage; | ||
129 | |||
130 | if (tp != null) | ||
131 | { | ||
132 | // Remove tab page from tab control | ||
133 | tabControl1.TabPages.Remove(tp); | ||
134 | // Remove app window from tab | ||
135 | tp.Controls.Remove(aw); | ||
136 | } | ||
137 | |||
138 | // Dispose of app window | ||
139 | aw.Dispose(); | ||
140 | |||
141 | // Dispose of tab page | ||
142 | if (tp != null) | ||
143 | tp.Dispose(); | ||
144 | |||
145 | // Remove from our internal list | ||
146 | AppWindow_Remove(App); | ||
147 | } | ||
148 | |||
149 | |||
150 | public delegate void Program_AppConsoleOutputDelegate(string App, string LogText); | ||
151 | void Program_AppConsoleOutput(string App, string LogText) | ||
152 | { | ||
153 | if (this.InvokeRequired) | ||
154 | { | ||
155 | this.Invoke(new Program_AppConsoleOutputDelegate(Program_AppConsoleOutput), App, LogText); | ||
156 | return; | ||
157 | } | ||
158 | |||
159 | // Get app window | ||
160 | ucAppWindow aw = AppWindow_Get(App); | ||
161 | // Write text to it | ||
162 | if (aw != null) | ||
163 | aw.Write(System.Drawing.Color.Black, LogText); | ||
164 | } | ||
165 | |||
166 | public delegate void Program_AppConsoleErrorDelegate(string App, string LogText); | ||
167 | void Program_AppConsoleError(string App, string LogText) | ||
168 | { | ||
169 | if (this.InvokeRequired) { | ||
170 | this.Invoke(new Program_AppConsoleErrorDelegate(Program_AppConsoleError), App, LogText); | ||
171 | return; | ||
172 | } | ||
173 | |||
174 | // Get app window | ||
175 | ucAppWindow aw = AppWindow_Get(App); | ||
176 | // Write text to it | ||
177 | if (aw != null) | ||
178 | aw.Write(System.Drawing.Color.Red, LogText); | ||
179 | |||
180 | } | ||
181 | #endregion | ||
182 | |||
183 | #region App Window events | ||
184 | private void AppWindow_LineEntered(ucAppWindow AppWindow, string LogText) | ||
185 | { | ||
186 | Program.WriteLine(AppWindow_Get(AppWindow), LogText); | ||
187 | } | ||
188 | #endregion | ||
189 | |||
190 | private void ProcessPanel_Load(object sender, EventArgs e) | ||
191 | { | ||
192 | string[] arr = new string[Program.Settings.Components.Keys.Count]; | ||
193 | Program.Settings.Components.Keys.CopyTo(arr, 0); | ||
194 | cblStartupComponents.Items.AddRange(arr); | ||
195 | |||
196 | // Now correct all check states | ||
197 | for (int i = 0; i < cblStartupComponents.Items.Count; i++ ) | ||
198 | { | ||
199 | string _name = cblStartupComponents.Items[i] as string; | ||
200 | bool _checked = Program.Settings.Components[_name]; | ||
201 | |||
202 | cblStartupComponents.SetItemChecked(i, _checked); | ||
203 | } | ||
204 | |||
205 | |||
206 | } | ||
207 | |||
208 | |||
209 | |||
210 | |||
211 | #region Internal App Window list and functions | ||
212 | private Dictionary<string, ucAppWindow> _appWindows = new Dictionary<string, ucAppWindow>(); | ||
213 | private Dictionary<ucAppWindow, string> _appWindows_rev = new Dictionary<ucAppWindow, string>(); | ||
214 | private void AppWindow_Add(string AppWindowName, ucAppWindow AppWindow) | ||
215 | { | ||
216 | lock (_appWindows) | ||
217 | { | ||
218 | _appWindows.Add(AppWindowName, AppWindow); | ||
219 | _appWindows_rev.Add(AppWindow, AppWindowName); | ||
220 | // Hook events | ||
221 | AppWindow.LineEntered += AppWindow_LineEntered; | ||
222 | } | ||
223 | } | ||
224 | private void AppWindow_Remove(ucAppWindow AppWindow) | ||
225 | { | ||
226 | lock (_appWindows) | ||
227 | { | ||
228 | if (_appWindows_rev.ContainsKey(AppWindow)) | ||
229 | { | ||
230 | // Unhook events | ||
231 | AppWindow.LineEntered -= AppWindow_LineEntered; | ||
232 | // Delete from list | ||
233 | string name = _appWindows_rev[AppWindow]; | ||
234 | _appWindows.Remove(name); | ||
235 | _appWindows_rev.Remove(AppWindow); | ||
236 | } | ||
237 | } | ||
238 | } | ||
239 | private void AppWindow_Remove(string AppWindowName) | ||
240 | { | ||
241 | lock (_appWindows) | ||
242 | { | ||
243 | if (_appWindows.ContainsKey(AppWindowName)) | ||
244 | { | ||
245 | ucAppWindow AppWindow = _appWindows[AppWindowName]; | ||
246 | // Unhook events | ||
247 | AppWindow.LineEntered -= AppWindow_LineEntered; | ||
248 | // Delete from list | ||
249 | _appWindows.Remove(AppWindowName); | ||
250 | _appWindows_rev.Remove(AppWindow); | ||
251 | } | ||
252 | } | ||
253 | } | ||
254 | private string AppWindow_Get(ucAppWindow AppWindow) | ||
255 | { | ||
256 | lock (_appWindows) | ||
257 | { | ||
258 | if (_appWindows_rev.ContainsKey(AppWindow)) | ||
259 | return _appWindows_rev[AppWindow]; | ||
260 | } | ||
261 | return null; | ||
262 | } | ||
263 | private ucAppWindow AppWindow_Get(string AppWindowName) | ||
264 | { | ||
265 | lock (_appWindows) | ||
266 | { | ||
267 | if (_appWindows.ContainsKey(AppWindowName)) | ||
268 | return _appWindows[AppWindowName]; | ||
269 | } | ||
270 | return null; | ||
271 | } | ||
272 | #endregion | ||
273 | |||
274 | private void btnSave_Click(object sender, EventArgs e) | ||
275 | { | ||
276 | Program.Settings.Components.Clear(); | ||
277 | for (int i = 0; i < cblStartupComponents.Items.Count; i++) | ||
278 | { | ||
279 | string _name = cblStartupComponents.Items[i] as string; | ||
280 | bool _checked = cblStartupComponents.GetItemChecked(i); | ||
281 | |||
282 | Program.Settings.Components.Add(_name, _checked); | ||
283 | Program.Settings.SaveConfig(); | ||
284 | } | ||
285 | } | ||
286 | |||
287 | } | ||
288 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx new file mode 100644 index 0000000..361d658 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ProcessPanel.resx | |||
@@ -0,0 +1,882 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <root> | ||
3 | <!-- | ||
4 | Microsoft ResX Schema | ||
5 | |||
6 | Version 2.0 | ||
7 | |||
8 | The primary goals of this format is to allow a simple XML format | ||
9 | that is mostly human readable. The generation and parsing of the | ||
10 | various data types are done through the TypeConverter classes | ||
11 | associated with the data types. | ||
12 | |||
13 | Example: | ||
14 | |||
15 | ... ado.net/XML headers & schema ... | ||
16 | <resheader name="resmimetype">text/microsoft-resx</resheader> | ||
17 | <resheader name="version">2.0</resheader> | ||
18 | <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||
19 | <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||
20 | <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||
21 | <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||
22 | <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||
23 | <value>[base64 mime encoded serialized .NET Framework object]</value> | ||
24 | </data> | ||
25 | <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
26 | <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||
27 | <comment>This is a comment</comment> | ||
28 | </data> | ||
29 | |||
30 | There are any number of "resheader" rows that contain simple | ||
31 | name/value pairs. | ||
32 | |||
33 | Each data row contains a name, and value. The row also contains a | ||
34 | type or mimetype. Type corresponds to a .NET class that support | ||
35 | text/value conversion through the TypeConverter architecture. | ||
36 | Classes that don't support this are serialized and stored with the | ||
37 | mimetype set. | ||
38 | |||
39 | The mimetype is used for serialized objects, and tells the | ||
40 | ResXResourceReader how to depersist the object. This is currently not | ||
41 | extensible. For a given mimetype the value must be set accordingly: | ||
42 | |||
43 | Note - application/x-microsoft.net.object.binary.base64 is the format | ||
44 | that the ResXResourceWriter will generate, however the reader can | ||
45 | read any of the formats listed below. | ||
46 | |||
47 | mimetype: application/x-microsoft.net.object.binary.base64 | ||
48 | value : The object must be serialized with | ||
49 | : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||
50 | : and then encoded with base64 encoding. | ||
51 | |||
52 | mimetype: application/x-microsoft.net.object.soap.base64 | ||
53 | value : The object must be serialized with | ||
54 | : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||
55 | : and then encoded with base64 encoding. | ||
56 | |||
57 | mimetype: application/x-microsoft.net.object.bytearray.base64 | ||
58 | value : The object must be serialized into a byte array | ||
59 | : using a System.ComponentModel.TypeConverter | ||
60 | : and then encoded with base64 encoding. | ||
61 | --> | ||
62 | <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||
63 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||
64 | <xsd:element name="root" msdata:IsDataSet="true"> | ||
65 | <xsd:complexType> | ||
66 | <xsd:choice maxOccurs="unbounded"> | ||
67 | <xsd:element name="metadata"> | ||
68 | <xsd:complexType> | ||
69 | <xsd:sequence> | ||
70 | <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||
71 | </xsd:sequence> | ||
72 | <xsd:attribute name="name" use="required" type="xsd:string" /> | ||
73 | <xsd:attribute name="type" type="xsd:string" /> | ||
74 | <xsd:attribute name="mimetype" type="xsd:string" /> | ||
75 | <xsd:attribute ref="xml:space" /> | ||
76 | </xsd:complexType> | ||
77 | </xsd:element> | ||
78 | <xsd:element name="assembly"> | ||
79 | <xsd:complexType> | ||
80 | <xsd:attribute name="alias" type="xsd:string" /> | ||
81 | <xsd:attribute name="name" type="xsd:string" /> | ||
82 | </xsd:complexType> | ||
83 | </xsd:element> | ||
84 | <xsd:element name="data"> | ||
85 | <xsd:complexType> | ||
86 | <xsd:sequence> | ||
87 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
88 | <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||
89 | </xsd:sequence> | ||
90 | <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||
91 | <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||
92 | <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||
93 | <xsd:attribute ref="xml:space" /> | ||
94 | </xsd:complexType> | ||
95 | </xsd:element> | ||
96 | <xsd:element name="resheader"> | ||
97 | <xsd:complexType> | ||
98 | <xsd:sequence> | ||
99 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
100 | </xsd:sequence> | ||
101 | <xsd:attribute name="name" type="xsd:string" use="required" /> | ||
102 | </xsd:complexType> | ||
103 | </xsd:element> | ||
104 | </xsd:choice> | ||
105 | </xsd:complexType> | ||
106 | </xsd:element> | ||
107 | </xsd:schema> | ||
108 | <resheader name="resmimetype"> | ||
109 | <value>text/microsoft-resx</value> | ||
110 | </resheader> | ||
111 | <resheader name="version"> | ||
112 | <value>2.0</value> | ||
113 | </resheader> | ||
114 | <resheader name="reader"> | ||
115 | <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
116 | </resheader> | ||
117 | <resheader name="writer"> | ||
118 | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
119 | </resheader> | ||
120 | <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> | ||
121 | <data name="pictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
122 | <value> | ||
123 | iVBORw0KGgoAAAANSUhEUgAAAAEAAAB8CAIAAAAny03BAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 | ||
124 | YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOpgAA | ||
125 | DqYBh9ypbwAAAYpJREFUKFOV0fkrH3AYwPG3Y84NW2xzj76btomJHE20NUcpi9DKUlt+0i6EjbnmiOWY | ||
126 | ZTKSo69YtolNRHOEYWsIK8sksiZZU5Ompo8n379gP7x63s/z+fEDdz7w3+4Oondv6JD+/WH0H4xgkDx6 | ||
127 | yDBlDMPUcY6kfcQofQKjjEmMH05h8ugTppmfMc36gtnjacyzZziaM8uxvDks8uexfLKAVcFXjhctcqL4 | ||
128 | G9YlS9iUfufk02VOla9wumIV28o17KvWcXj+A8fqnzi92MC5ZhOX2i1cX/5CU/8bTcM25xr/4Na0w/mW | ||
129 | XS5q/+LeuodH2z882ve51KHweq3wfqvw6VT4din83ykC3isu9yoC+xRB/Qq7bHDIBfs8sJPpWABOxXIr | ||
130 | lFsRuJaJCtA8gzPibDVcqAE34VknXStv0n7N0rJ7N0m3QIAWrrZBYCtcewVXRLAIeQMRnXKTGdmtE9YF | ||
131 | 0T0QLh0lM6YProu4fgjthRsDcFO+79YQJIhY6fhBSByB26M6SeM6idIJwxwAjlSW4/2by3sAAAAASUVO | ||
132 | RK5CYII= | ||
133 | </value> | ||
134 | </data> | ||
135 | <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
136 | <value> | ||
137 | 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 | ||
795 | LommXdJfWieeUW0QWSdZUiedV2u8pF62oE6+qN5sTZMyqtF8VZPVpis2m6/Ybr9qt+2q44YrTrHXXTZd | ||
796 | dY257rbtmseOG57br3vH3/SJu+mbcMsv/qZf4m3/vbe6xd/qlnArIOF2QMqdgLhbgQm3CaXeCYy/FZh8 | ||
797 | OxA5OCbeDtx9K3DPLXK640Zg0m2SxhFsyEF63x2SBmfMDVIQl9RsuASBrCx4dt0MSL4dkHgrYNdNUvWO | ||
798 | m/6xN/ygz64bvjtv+MTf9Iq76Rl/02PnDbfNV12h/7orTpuuOq5ttlt/2WZlk/W6ZstVTebRTcoVjWZR | ||
799 | jfLIepNFdUaL66QLayXL6g1mVIvn1ujPrhYtqhVNuSicfUk48YLOrIuC6RcF484LJp7nj0WIRkELIAeE | ||
800 | mH2JNwYB03nejIskjfwhQBp6aTgFnvHnyKXJNAFO8IymObiE04kI+3BHjeYgDTkzL6lEAR0hB/lgQ3Gk | ||
801 | cUQaVSCBq+ojCk6hmUwZJFgaRQi40iMYUAvTQa0Ypz9nfwwVbvxw8/df6n9482qAbcLZNboTLogmXxLN | ||
802 | rtZfWi+edslgYZ1kUZ00ssF4Wo0JQC6q0XRFo2J1szK62WLLVQpyV222XrXbcMVh61XHbdec1lx22XXD | ||
803 | Jfa6647rbvE33Xfc8Nh23XPnTc/Y616brgFRvHfd9N59E+jik3jbZ8cNH6S3XScUd9Nn1w2fPTd9Ym+Q | ||
804 | NEVHkgaBB8e9t0gOOHfd9Nl+nZxGX1FdAlyxq6At1wgPchJueW+5huq8dt7wggJrrwJ0AWbu26+7xV53 | ||
805 | 236d6em8/Zrj9msO6y/bbbpiu/GKTWSj1eYrlmuaCbCtazZb0QhQl6H5C2ql06oNF9dJFtSJ59WKF9Tq | ||
806 | LakjSwEYbfx54bjzOjMuCaZcEMy8JJhwgT/1IsGVaQAebDCep6hDAQn5I8/yJlEIwWk/7EDSSwyuplwk | ||
807 | NBx3wiiezakmzMgBD44RuE+GSAvxH6I3ygkGAnKXyBH8uARCceQjAQWQABvk44iyuIR8Vgu7ikykUQur | ||
808 | CEIIWNJMcKIWKM/pz9mfGz/c/P1X+x/e/DodeOq5NcL5tboL60RL6vUW1ukvqhMvbTCYVC1ZUi9d3mC0 | ||
809 | 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 | ||
880 | </value> | ||
881 | </data> | ||
882 | </root> \ 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 new file mode 100644 index 0000000..1ff7d43 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.Designer.cs | |||
@@ -0,0 +1,72 @@ | |||
1 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
2 | { | ||
3 | partial class ucAppWindow | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Required designer variable. | ||
7 | /// </summary> | ||
8 | private System.ComponentModel.IContainer components = null; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Clean up any resources being used. | ||
12 | /// </summary> | ||
13 | /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||
14 | protected override void Dispose(bool disposing) | ||
15 | { | ||
16 | if (disposing && (components != null)) | ||
17 | { | ||
18 | components.Dispose(); | ||
19 | } | ||
20 | base.Dispose(disposing); | ||
21 | } | ||
22 | |||
23 | #region Component Designer generated code | ||
24 | |||
25 | /// <summary> | ||
26 | /// Required method for Designer support - do not modify | ||
27 | /// the contents of this method with the code editor. | ||
28 | /// </summary> | ||
29 | private void InitializeComponent() | ||
30 | { | ||
31 | this.ucLogWindow1 = new OpenSim.GridLaunch.GUI.WinForm.ucLogWindow(); | ||
32 | this.ucInputField1 = new OpenSim.GridLaunch.GUI.WinForm.ucInputField(); | ||
33 | this.SuspendLayout(); | ||
34 | // | ||
35 | // ucLogWindow1 | ||
36 | // | ||
37 | this.ucLogWindow1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | ||
38 | | System.Windows.Forms.AnchorStyles.Left) | ||
39 | | System.Windows.Forms.AnchorStyles.Right))); | ||
40 | this.ucLogWindow1.Location = new System.Drawing.Point(3, 3); | ||
41 | this.ucLogWindow1.Name = "ucLogWindow1"; | ||
42 | this.ucLogWindow1.Size = new System.Drawing.Size(232, 132); | ||
43 | this.ucLogWindow1.TabIndex = 0; | ||
44 | // | ||
45 | // ucInputField1 | ||
46 | // | ||
47 | this.ucInputField1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | ||
48 | | System.Windows.Forms.AnchorStyles.Right))); | ||
49 | this.ucInputField1.Location = new System.Drawing.Point(0, 141); | ||
50 | this.ucInputField1.Name = "ucInputField1"; | ||
51 | this.ucInputField1.Size = new System.Drawing.Size(234, 30); | ||
52 | this.ucInputField1.TabIndex = 1; | ||
53 | // | ||
54 | // ucAppWindow | ||
55 | // | ||
56 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); | ||
57 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||
58 | this.Controls.Add(this.ucInputField1); | ||
59 | this.Controls.Add(this.ucLogWindow1); | ||
60 | this.DoubleBuffered = true; | ||
61 | this.Name = "ucAppWindow"; | ||
62 | this.Size = new System.Drawing.Size(235, 166); | ||
63 | this.ResumeLayout(false); | ||
64 | |||
65 | } | ||
66 | |||
67 | #endregion | ||
68 | |||
69 | private ucLogWindow ucLogWindow1; | ||
70 | private ucInputField ucInputField1; | ||
71 | } | ||
72 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs new file mode 100644 index 0000000..66072dc --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.cs | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.ComponentModel; | ||
30 | using System.Drawing; | ||
31 | using System.Data; | ||
32 | using System.Text; | ||
33 | using System.Windows.Forms; | ||
34 | |||
35 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
36 | { | ||
37 | public partial class ucAppWindow : UserControl | ||
38 | { | ||
39 | // Just forwarding from ucInputField1 | ||
40 | public delegate void LineEnteredDelegate(ucAppWindow AppWindow, string Text); | ||
41 | public event LineEnteredDelegate LineEntered; | ||
42 | |||
43 | public ucAppWindow() | ||
44 | { | ||
45 | InitializeComponent(); | ||
46 | ucInputField1.LineEntered += ucInputField1_LineEntered; | ||
47 | } | ||
48 | |||
49 | #region Forward Text Input Event and Log Write Function | ||
50 | void ucInputField1_LineEntered(string Text) | ||
51 | { | ||
52 | if (LineEntered != null) | ||
53 | LineEntered(this, Text); | ||
54 | } | ||
55 | |||
56 | public void Write(Color color, string LogText) | ||
57 | { | ||
58 | ucLogWindow1.Write(color, LogText); | ||
59 | } | ||
60 | #endregion | ||
61 | |||
62 | } | ||
63 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucAppWindow.resx | |||
@@ -0,0 +1,120 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <root> | ||
3 | <!-- | ||
4 | Microsoft ResX Schema | ||
5 | |||
6 | Version 2.0 | ||
7 | |||
8 | The primary goals of this format is to allow a simple XML format | ||
9 | that is mostly human readable. The generation and parsing of the | ||
10 | various data types are done through the TypeConverter classes | ||
11 | associated with the data types. | ||
12 | |||
13 | Example: | ||
14 | |||
15 | ... ado.net/XML headers & schema ... | ||
16 | <resheader name="resmimetype">text/microsoft-resx</resheader> | ||
17 | <resheader name="version">2.0</resheader> | ||
18 | <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||
19 | <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||
20 | <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||
21 | <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||
22 | <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||
23 | <value>[base64 mime encoded serialized .NET Framework object]</value> | ||
24 | </data> | ||
25 | <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
26 | <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||
27 | <comment>This is a comment</comment> | ||
28 | </data> | ||
29 | |||
30 | There are any number of "resheader" rows that contain simple | ||
31 | name/value pairs. | ||
32 | |||
33 | Each data row contains a name, and value. The row also contains a | ||
34 | type or mimetype. Type corresponds to a .NET class that support | ||
35 | text/value conversion through the TypeConverter architecture. | ||
36 | Classes that don't support this are serialized and stored with the | ||
37 | mimetype set. | ||
38 | |||
39 | The mimetype is used for serialized objects, and tells the | ||
40 | ResXResourceReader how to depersist the object. This is currently not | ||
41 | extensible. For a given mimetype the value must be set accordingly: | ||
42 | |||
43 | Note - application/x-microsoft.net.object.binary.base64 is the format | ||
44 | that the ResXResourceWriter will generate, however the reader can | ||
45 | read any of the formats listed below. | ||
46 | |||
47 | mimetype: application/x-microsoft.net.object.binary.base64 | ||
48 | value : The object must be serialized with | ||
49 | : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||
50 | : and then encoded with base64 encoding. | ||
51 | |||
52 | mimetype: application/x-microsoft.net.object.soap.base64 | ||
53 | value : The object must be serialized with | ||
54 | : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||
55 | : and then encoded with base64 encoding. | ||
56 | |||
57 | mimetype: application/x-microsoft.net.object.bytearray.base64 | ||
58 | value : The object must be serialized into a byte array | ||
59 | : using a System.ComponentModel.TypeConverter | ||
60 | : and then encoded with base64 encoding. | ||
61 | --> | ||
62 | <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||
63 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||
64 | <xsd:element name="root" msdata:IsDataSet="true"> | ||
65 | <xsd:complexType> | ||
66 | <xsd:choice maxOccurs="unbounded"> | ||
67 | <xsd:element name="metadata"> | ||
68 | <xsd:complexType> | ||
69 | <xsd:sequence> | ||
70 | <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||
71 | </xsd:sequence> | ||
72 | <xsd:attribute name="name" use="required" type="xsd:string" /> | ||
73 | <xsd:attribute name="type" type="xsd:string" /> | ||
74 | <xsd:attribute name="mimetype" type="xsd:string" /> | ||
75 | <xsd:attribute ref="xml:space" /> | ||
76 | </xsd:complexType> | ||
77 | </xsd:element> | ||
78 | <xsd:element name="assembly"> | ||
79 | <xsd:complexType> | ||
80 | <xsd:attribute name="alias" type="xsd:string" /> | ||
81 | <xsd:attribute name="name" type="xsd:string" /> | ||
82 | </xsd:complexType> | ||
83 | </xsd:element> | ||
84 | <xsd:element name="data"> | ||
85 | <xsd:complexType> | ||
86 | <xsd:sequence> | ||
87 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
88 | <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||
89 | </xsd:sequence> | ||
90 | <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||
91 | <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||
92 | <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||
93 | <xsd:attribute ref="xml:space" /> | ||
94 | </xsd:complexType> | ||
95 | </xsd:element> | ||
96 | <xsd:element name="resheader"> | ||
97 | <xsd:complexType> | ||
98 | <xsd:sequence> | ||
99 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
100 | </xsd:sequence> | ||
101 | <xsd:attribute name="name" type="xsd:string" use="required" /> | ||
102 | </xsd:complexType> | ||
103 | </xsd:element> | ||
104 | </xsd:choice> | ||
105 | </xsd:complexType> | ||
106 | </xsd:element> | ||
107 | </xsd:schema> | ||
108 | <resheader name="resmimetype"> | ||
109 | <value>text/microsoft-resx</value> | ||
110 | </resheader> | ||
111 | <resheader name="version"> | ||
112 | <value>2.0</value> | ||
113 | </resheader> | ||
114 | <resheader name="reader"> | ||
115 | <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
116 | </resheader> | ||
117 | <resheader name="writer"> | ||
118 | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
119 | </resheader> | ||
120 | </root> \ 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 new file mode 100644 index 0000000..1eaec69 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.Designer.cs | |||
@@ -0,0 +1,77 @@ | |||
1 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
2 | { | ||
3 | partial class ucInputField | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Required designer variable. | ||
7 | /// </summary> | ||
8 | private System.ComponentModel.IContainer components = null; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Clean up any resources being used. | ||
12 | /// </summary> | ||
13 | /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||
14 | protected override void Dispose(bool disposing) | ||
15 | { | ||
16 | if (disposing && (components != null)) | ||
17 | { | ||
18 | components.Dispose(); | ||
19 | } | ||
20 | base.Dispose(disposing); | ||
21 | } | ||
22 | |||
23 | #region Component Designer generated code | ||
24 | |||
25 | /// <summary> | ||
26 | /// Required method for Designer support - do not modify | ||
27 | /// the contents of this method with the code editor. | ||
28 | /// </summary> | ||
29 | private void InitializeComponent() | ||
30 | { | ||
31 | this.txtInput = new System.Windows.Forms.TextBox(); | ||
32 | this.btnSend = new System.Windows.Forms.Button(); | ||
33 | this.SuspendLayout(); | ||
34 | // | ||
35 | // txtInput | ||
36 | // | ||
37 | this.txtInput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | ||
38 | | System.Windows.Forms.AnchorStyles.Left) | ||
39 | | System.Windows.Forms.AnchorStyles.Right))); | ||
40 | this.txtInput.Location = new System.Drawing.Point(3, 2); | ||
41 | this.txtInput.Name = "txtInput"; | ||
42 | this.txtInput.Size = new System.Drawing.Size(289, 20); | ||
43 | this.txtInput.TabIndex = 0; | ||
44 | this.txtInput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtInput_KeyPress); | ||
45 | // | ||
46 | // btnSend | ||
47 | // | ||
48 | this.btnSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); | ||
49 | this.btnSend.Location = new System.Drawing.Point(295, 0); | ||
50 | this.btnSend.Name = "btnSend"; | ||
51 | this.btnSend.Size = new System.Drawing.Size(75, 23); | ||
52 | this.btnSend.TabIndex = 3; | ||
53 | this.btnSend.Text = "&Send"; | ||
54 | this.btnSend.UseVisualStyleBackColor = true; | ||
55 | this.btnSend.Click += new System.EventHandler(this.btnSend_Click); | ||
56 | // | ||
57 | // ucInputField | ||
58 | // | ||
59 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); | ||
60 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||
61 | this.Controls.Add(this.btnSend); | ||
62 | this.Controls.Add(this.txtInput); | ||
63 | this.Name = "ucInputField"; | ||
64 | this.Size = new System.Drawing.Size(373, 25); | ||
65 | this.Load += new System.EventHandler(this.ucInputField_Load); | ||
66 | this.Resize += new System.EventHandler(this.ucInputField_Resize); | ||
67 | this.ResumeLayout(false); | ||
68 | this.PerformLayout(); | ||
69 | |||
70 | } | ||
71 | |||
72 | #endregion | ||
73 | |||
74 | private System.Windows.Forms.TextBox txtInput; | ||
75 | private System.Windows.Forms.Button btnSend; | ||
76 | } | ||
77 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs new file mode 100644 index 0000000..5ffa275 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.cs | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.ComponentModel; | ||
30 | using System.Diagnostics; | ||
31 | using System.Drawing; | ||
32 | using System.Data; | ||
33 | using System.Text; | ||
34 | using System.Windows.Forms; | ||
35 | |||
36 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
37 | { | ||
38 | public partial class ucInputField : UserControl | ||
39 | { | ||
40 | public delegate void LineEnteredDelegate(string Text); | ||
41 | public event LineEnteredDelegate LineEntered; | ||
42 | |||
43 | public List<string> History = new List<string>(); | ||
44 | |||
45 | public ucInputField() | ||
46 | { | ||
47 | InitializeComponent(); | ||
48 | } | ||
49 | |||
50 | private void ucInputField_Load(object sender, EventArgs e) | ||
51 | { | ||
52 | _resize(); | ||
53 | } | ||
54 | |||
55 | private void ucInputField_Resize(object sender, EventArgs e) | ||
56 | { | ||
57 | _resize(); | ||
58 | } | ||
59 | |||
60 | private void _resize() | ||
61 | { | ||
62 | Height = txtInput.Height + 10; | ||
63 | } | ||
64 | |||
65 | private void btnSend_Click(object sender, EventArgs e) | ||
66 | { | ||
67 | Send(); | ||
68 | } | ||
69 | |||
70 | private void txtInput_KeyPress(object sender, KeyPressEventArgs e) | ||
71 | { | ||
72 | //Trace.WriteLine("KeyChar: " + ((int)e.KeyChar).ToString()); | ||
73 | if (e.KeyChar == 13) | ||
74 | { | ||
75 | e.Handled = true; | ||
76 | Send(); | ||
77 | } | ||
78 | |||
79 | // TODO: Add arrow up/down history functions | ||
80 | } | ||
81 | |||
82 | private void Send() | ||
83 | { | ||
84 | // Remove \r\n at end | ||
85 | string txt = txtInput.Text.TrimEnd("\r\n".ToCharArray()); | ||
86 | |||
87 | // Fire event | ||
88 | if (LineEntered != null) | ||
89 | LineEntered(txt); | ||
90 | |||
91 | // Add to history | ||
92 | History.Add(txtInput.Text); | ||
93 | |||
94 | txtInput.Text = ""; | ||
95 | } | ||
96 | } | ||
97 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucInputField.resx | |||
@@ -0,0 +1,120 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <root> | ||
3 | <!-- | ||
4 | Microsoft ResX Schema | ||
5 | |||
6 | Version 2.0 | ||
7 | |||
8 | The primary goals of this format is to allow a simple XML format | ||
9 | that is mostly human readable. The generation and parsing of the | ||
10 | various data types are done through the TypeConverter classes | ||
11 | associated with the data types. | ||
12 | |||
13 | Example: | ||
14 | |||
15 | ... ado.net/XML headers & schema ... | ||
16 | <resheader name="resmimetype">text/microsoft-resx</resheader> | ||
17 | <resheader name="version">2.0</resheader> | ||
18 | <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||
19 | <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||
20 | <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||
21 | <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||
22 | <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||
23 | <value>[base64 mime encoded serialized .NET Framework object]</value> | ||
24 | </data> | ||
25 | <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
26 | <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||
27 | <comment>This is a comment</comment> | ||
28 | </data> | ||
29 | |||
30 | There are any number of "resheader" rows that contain simple | ||
31 | name/value pairs. | ||
32 | |||
33 | Each data row contains a name, and value. The row also contains a | ||
34 | type or mimetype. Type corresponds to a .NET class that support | ||
35 | text/value conversion through the TypeConverter architecture. | ||
36 | Classes that don't support this are serialized and stored with the | ||
37 | mimetype set. | ||
38 | |||
39 | The mimetype is used for serialized objects, and tells the | ||
40 | ResXResourceReader how to depersist the object. This is currently not | ||
41 | extensible. For a given mimetype the value must be set accordingly: | ||
42 | |||
43 | Note - application/x-microsoft.net.object.binary.base64 is the format | ||
44 | that the ResXResourceWriter will generate, however the reader can | ||
45 | read any of the formats listed below. | ||
46 | |||
47 | mimetype: application/x-microsoft.net.object.binary.base64 | ||
48 | value : The object must be serialized with | ||
49 | : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||
50 | : and then encoded with base64 encoding. | ||
51 | |||
52 | mimetype: application/x-microsoft.net.object.soap.base64 | ||
53 | value : The object must be serialized with | ||
54 | : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||
55 | : and then encoded with base64 encoding. | ||
56 | |||
57 | mimetype: application/x-microsoft.net.object.bytearray.base64 | ||
58 | value : The object must be serialized into a byte array | ||
59 | : using a System.ComponentModel.TypeConverter | ||
60 | : and then encoded with base64 encoding. | ||
61 | --> | ||
62 | <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||
63 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||
64 | <xsd:element name="root" msdata:IsDataSet="true"> | ||
65 | <xsd:complexType> | ||
66 | <xsd:choice maxOccurs="unbounded"> | ||
67 | <xsd:element name="metadata"> | ||
68 | <xsd:complexType> | ||
69 | <xsd:sequence> | ||
70 | <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||
71 | </xsd:sequence> | ||
72 | <xsd:attribute name="name" use="required" type="xsd:string" /> | ||
73 | <xsd:attribute name="type" type="xsd:string" /> | ||
74 | <xsd:attribute name="mimetype" type="xsd:string" /> | ||
75 | <xsd:attribute ref="xml:space" /> | ||
76 | </xsd:complexType> | ||
77 | </xsd:element> | ||
78 | <xsd:element name="assembly"> | ||
79 | <xsd:complexType> | ||
80 | <xsd:attribute name="alias" type="xsd:string" /> | ||
81 | <xsd:attribute name="name" type="xsd:string" /> | ||
82 | </xsd:complexType> | ||
83 | </xsd:element> | ||
84 | <xsd:element name="data"> | ||
85 | <xsd:complexType> | ||
86 | <xsd:sequence> | ||
87 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
88 | <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||
89 | </xsd:sequence> | ||
90 | <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||
91 | <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||
92 | <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||
93 | <xsd:attribute ref="xml:space" /> | ||
94 | </xsd:complexType> | ||
95 | </xsd:element> | ||
96 | <xsd:element name="resheader"> | ||
97 | <xsd:complexType> | ||
98 | <xsd:sequence> | ||
99 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
100 | </xsd:sequence> | ||
101 | <xsd:attribute name="name" type="xsd:string" use="required" /> | ||
102 | </xsd:complexType> | ||
103 | </xsd:element> | ||
104 | </xsd:choice> | ||
105 | </xsd:complexType> | ||
106 | </xsd:element> | ||
107 | </xsd:schema> | ||
108 | <resheader name="resmimetype"> | ||
109 | <value>text/microsoft-resx</value> | ||
110 | </resheader> | ||
111 | <resheader name="version"> | ||
112 | <value>2.0</value> | ||
113 | </resheader> | ||
114 | <resheader name="reader"> | ||
115 | <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
116 | </resheader> | ||
117 | <resheader name="writer"> | ||
118 | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
119 | </resheader> | ||
120 | </root> \ 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 new file mode 100644 index 0000000..839fe99 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.Designer.cs | |||
@@ -0,0 +1,62 @@ | |||
1 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
2 | { | ||
3 | partial class ucLogWindow | ||
4 | { | ||
5 | /// <summary> | ||
6 | /// Required designer variable. | ||
7 | /// </summary> | ||
8 | private System.ComponentModel.IContainer components = null; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Clean up any resources being used. | ||
12 | /// </summary> | ||
13 | /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | ||
14 | protected override void Dispose(bool disposing) | ||
15 | { | ||
16 | if (disposing && (components != null)) | ||
17 | { | ||
18 | components.Dispose(); | ||
19 | } | ||
20 | base.Dispose(disposing); | ||
21 | } | ||
22 | |||
23 | #region Component Designer generated code | ||
24 | |||
25 | /// <summary> | ||
26 | /// Required method for Designer support - do not modify | ||
27 | /// the contents of this method with the code editor. | ||
28 | /// </summary> | ||
29 | private void InitializeComponent() | ||
30 | { | ||
31 | this.txtLog = new System.Windows.Forms.TextBox(); | ||
32 | this.SuspendLayout(); | ||
33 | // | ||
34 | // txtLog | ||
35 | // | ||
36 | this.txtLog.BackColor = System.Drawing.SystemColors.Window; | ||
37 | this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill; | ||
38 | this.txtLog.Location = new System.Drawing.Point(0, 0); | ||
39 | this.txtLog.Multiline = true; | ||
40 | this.txtLog.Name = "txtLog"; | ||
41 | this.txtLog.ReadOnly = true; | ||
42 | this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; | ||
43 | this.txtLog.Size = new System.Drawing.Size(150, 150); | ||
44 | this.txtLog.TabIndex = 0; | ||
45 | this.txtLog.TextChanged += new System.EventHandler(this.txtLog_TextChanged); | ||
46 | // | ||
47 | // ucLogWindow | ||
48 | // | ||
49 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); | ||
50 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | ||
51 | this.Controls.Add(this.txtLog); | ||
52 | this.Name = "ucLogWindow"; | ||
53 | this.ResumeLayout(false); | ||
54 | this.PerformLayout(); | ||
55 | |||
56 | } | ||
57 | |||
58 | #endregion | ||
59 | |||
60 | private System.Windows.Forms.TextBox txtLog; | ||
61 | } | ||
62 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs new file mode 100644 index 0000000..7b35c15 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.cs | |||
@@ -0,0 +1,54 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.ComponentModel; | ||
4 | using System.Drawing; | ||
5 | using System.Data; | ||
6 | using System.Text; | ||
7 | using System.Windows.Forms; | ||
8 | |||
9 | namespace OpenSim.GridLaunch.GUI.WinForm | ||
10 | { | ||
11 | public partial class ucLogWindow : UserControl | ||
12 | { | ||
13 | // If text in window is more than this | ||
14 | private static readonly int logWindowMaxTextLength = 20000; | ||
15 | // Remove this much from start of it | ||
16 | private static int logWindowTrunlTextLength = 10000; | ||
17 | |||
18 | public ucLogWindow() | ||
19 | { | ||
20 | if (logWindowMaxTextLength < logWindowTrunlTextLength) | ||
21 | logWindowTrunlTextLength = logWindowMaxTextLength / 2; | ||
22 | |||
23 | InitializeComponent(); | ||
24 | } | ||
25 | |||
26 | public delegate void textWriteDelegate(Color color, string LogText); | ||
27 | public void Write(Color color, string LogText) | ||
28 | { | ||
29 | // Check if we to pass task on to GUI thread | ||
30 | if (this.InvokeRequired) | ||
31 | { | ||
32 | this.Invoke(new textWriteDelegate(Write), color, LogText); | ||
33 | return; | ||
34 | } | ||
35 | // Append to window | ||
36 | try | ||
37 | { | ||
38 | if (!txtLog.IsDisposed) | ||
39 | txtLog.AppendText(LogText); | ||
40 | } catch { } | ||
41 | } | ||
42 | |||
43 | private void txtLog_TextChanged(object sender, EventArgs e) | ||
44 | { | ||
45 | // Go to bottom of window | ||
46 | txtLog.ScrollToCaret(); | ||
47 | |||
48 | // Make sure amount of text in window doesn't grow too big | ||
49 | if (txtLog.Text.Length > logWindowMaxTextLength) | ||
50 | txtLog.Text = txtLog.Text.Remove(0, logWindowTrunlTextLength); | ||
51 | } | ||
52 | |||
53 | } | ||
54 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/GUI/WinForm/ucLogWindow.resx | |||
@@ -0,0 +1,120 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <root> | ||
3 | <!-- | ||
4 | Microsoft ResX Schema | ||
5 | |||
6 | Version 2.0 | ||
7 | |||
8 | The primary goals of this format is to allow a simple XML format | ||
9 | that is mostly human readable. The generation and parsing of the | ||
10 | various data types are done through the TypeConverter classes | ||
11 | associated with the data types. | ||
12 | |||
13 | Example: | ||
14 | |||
15 | ... ado.net/XML headers & schema ... | ||
16 | <resheader name="resmimetype">text/microsoft-resx</resheader> | ||
17 | <resheader name="version">2.0</resheader> | ||
18 | <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||
19 | <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||
20 | <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||
21 | <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||
22 | <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||
23 | <value>[base64 mime encoded serialized .NET Framework object]</value> | ||
24 | </data> | ||
25 | <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
26 | <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||
27 | <comment>This is a comment</comment> | ||
28 | </data> | ||
29 | |||
30 | There are any number of "resheader" rows that contain simple | ||
31 | name/value pairs. | ||
32 | |||
33 | Each data row contains a name, and value. The row also contains a | ||
34 | type or mimetype. Type corresponds to a .NET class that support | ||
35 | text/value conversion through the TypeConverter architecture. | ||
36 | Classes that don't support this are serialized and stored with the | ||
37 | mimetype set. | ||
38 | |||
39 | The mimetype is used for serialized objects, and tells the | ||
40 | ResXResourceReader how to depersist the object. This is currently not | ||
41 | extensible. For a given mimetype the value must be set accordingly: | ||
42 | |||
43 | Note - application/x-microsoft.net.object.binary.base64 is the format | ||
44 | that the ResXResourceWriter will generate, however the reader can | ||
45 | read any of the formats listed below. | ||
46 | |||
47 | mimetype: application/x-microsoft.net.object.binary.base64 | ||
48 | value : The object must be serialized with | ||
49 | : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||
50 | : and then encoded with base64 encoding. | ||
51 | |||
52 | mimetype: application/x-microsoft.net.object.soap.base64 | ||
53 | value : The object must be serialized with | ||
54 | : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||
55 | : and then encoded with base64 encoding. | ||
56 | |||
57 | mimetype: application/x-microsoft.net.object.bytearray.base64 | ||
58 | value : The object must be serialized into a byte array | ||
59 | : using a System.ComponentModel.TypeConverter | ||
60 | : and then encoded with base64 encoding. | ||
61 | --> | ||
62 | <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||
63 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||
64 | <xsd:element name="root" msdata:IsDataSet="true"> | ||
65 | <xsd:complexType> | ||
66 | <xsd:choice maxOccurs="unbounded"> | ||
67 | <xsd:element name="metadata"> | ||
68 | <xsd:complexType> | ||
69 | <xsd:sequence> | ||
70 | <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||
71 | </xsd:sequence> | ||
72 | <xsd:attribute name="name" use="required" type="xsd:string" /> | ||
73 | <xsd:attribute name="type" type="xsd:string" /> | ||
74 | <xsd:attribute name="mimetype" type="xsd:string" /> | ||
75 | <xsd:attribute ref="xml:space" /> | ||
76 | </xsd:complexType> | ||
77 | </xsd:element> | ||
78 | <xsd:element name="assembly"> | ||
79 | <xsd:complexType> | ||
80 | <xsd:attribute name="alias" type="xsd:string" /> | ||
81 | <xsd:attribute name="name" type="xsd:string" /> | ||
82 | </xsd:complexType> | ||
83 | </xsd:element> | ||
84 | <xsd:element name="data"> | ||
85 | <xsd:complexType> | ||
86 | <xsd:sequence> | ||
87 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
88 | <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||
89 | </xsd:sequence> | ||
90 | <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||
91 | <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||
92 | <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||
93 | <xsd:attribute ref="xml:space" /> | ||
94 | </xsd:complexType> | ||
95 | </xsd:element> | ||
96 | <xsd:element name="resheader"> | ||
97 | <xsd:complexType> | ||
98 | <xsd:sequence> | ||
99 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
100 | </xsd:sequence> | ||
101 | <xsd:attribute name="name" type="xsd:string" use="required" /> | ||
102 | </xsd:complexType> | ||
103 | </xsd:element> | ||
104 | </xsd:choice> | ||
105 | </xsd:complexType> | ||
106 | </xsd:element> | ||
107 | </xsd:schema> | ||
108 | <resheader name="resmimetype"> | ||
109 | <value>text/microsoft-resx</value> | ||
110 | </resheader> | ||
111 | <resheader name="version"> | ||
112 | <value>2.0</value> | ||
113 | </resheader> | ||
114 | <resheader name="reader"> | ||
115 | <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
116 | </resheader> | ||
117 | <resheader name="writer"> | ||
118 | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
119 | </resheader> | ||
120 | </root> \ No newline at end of file | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj new file mode 100644 index 0000000..b262dd1 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.csproj | |||
@@ -0,0 +1,126 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
3 | <PropertyGroup> | ||
4 | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||
5 | <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | ||
6 | <ProductVersion>9.0.30729</ProductVersion> | ||
7 | <SchemaVersion>2.0</SchemaVersion> | ||
8 | <ProjectGuid>{595D67F3-B413-4A43-8568-5B5930E3B31D}</ProjectGuid> | ||
9 | <OutputType>Exe</OutputType> | ||
10 | <AppDesignerFolder>Properties</AppDesignerFolder> | ||
11 | <RootNamespace>OpenSim.GridLaunch</RootNamespace> | ||
12 | <AssemblyName>OpenSim.GridLaunch</AssemblyName> | ||
13 | <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> | ||
14 | <FileAlignment>512</FileAlignment> | ||
15 | </PropertyGroup> | ||
16 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | ||
17 | <DebugSymbols>true</DebugSymbols> | ||
18 | <DebugType>full</DebugType> | ||
19 | <Optimize>false</Optimize> | ||
20 | <OutputPath>..\..\..\bin\</OutputPath> | ||
21 | <DefineConstants>DEBUG;TRACE</DefineConstants> | ||
22 | <ErrorReport>prompt</ErrorReport> | ||
23 | <WarningLevel>4</WarningLevel> | ||
24 | <PlatformTarget>x86</PlatformTarget> | ||
25 | </PropertyGroup> | ||
26 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | ||
27 | <DebugType>pdbonly</DebugType> | ||
28 | <Optimize>true</Optimize> | ||
29 | <OutputPath>bin\Release\</OutputPath> | ||
30 | <DefineConstants>TRACE</DefineConstants> | ||
31 | <ErrorReport>prompt</ErrorReport> | ||
32 | <WarningLevel>4</WarningLevel> | ||
33 | </PropertyGroup> | ||
34 | <ItemGroup> | ||
35 | <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL" /> | ||
36 | <Reference Include="System" /> | ||
37 | <Reference Include="System.Data" /> | ||
38 | <Reference Include="System.Drawing" /> | ||
39 | <Reference Include="System.ServiceProcess" /> | ||
40 | <Reference Include="System.Windows.Forms" /> | ||
41 | <Reference Include="System.Xml" /> | ||
42 | </ItemGroup> | ||
43 | <ItemGroup> | ||
44 | <Compile Include="AppExecutor.cs" /> | ||
45 | <Compile Include="AppExecutor_AsyncIO.cs" /> | ||
46 | <Compile Include="AppExecutor_Thread.cs" /> | ||
47 | <Compile Include="CommandProcessor.cs" /> | ||
48 | <Compile Include="GUI\Console\Console.cs" /> | ||
49 | <Compile Include="GUI\IGUI.cs" /> | ||
50 | <Compile Include="GUI\Network\Client.cs" /> | ||
51 | <Compile Include="GUI\Network\TCPD.cs" /> | ||
52 | <Compile Include="GUI\Service\Service.cs"> | ||
53 | <SubType>Component</SubType> | ||
54 | </Compile> | ||
55 | <Compile Include="GUI\WinForm\ProcessPanel.cs"> | ||
56 | <SubType>Form</SubType> | ||
57 | </Compile> | ||
58 | <Compile Include="GUI\WinForm\ProcessPanel.Designer.cs"> | ||
59 | <DependentUpon>ProcessPanel.cs</DependentUpon> | ||
60 | </Compile> | ||
61 | <Compile Include="GUI\WinForm\ucAppWindow.cs"> | ||
62 | <SubType>UserControl</SubType> | ||
63 | </Compile> | ||
64 | <Compile Include="GUI\WinForm\ucAppWindow.Designer.cs"> | ||
65 | <DependentUpon>ucAppWindow.cs</DependentUpon> | ||
66 | </Compile> | ||
67 | <Compile Include="GUI\WinForm\ucInputField.cs"> | ||
68 | <SubType>UserControl</SubType> | ||
69 | </Compile> | ||
70 | <Compile Include="GUI\WinForm\ucInputField.Designer.cs"> | ||
71 | <DependentUpon>ucInputField.cs</DependentUpon> | ||
72 | </Compile> | ||
73 | <Compile Include="GUI\WinForm\ucLogWindow.cs"> | ||
74 | <SubType>UserControl</SubType> | ||
75 | </Compile> | ||
76 | <Compile Include="GUI\WinForm\ucLogWindow.Designer.cs"> | ||
77 | <DependentUpon>ucLogWindow.cs</DependentUpon> | ||
78 | </Compile> | ||
79 | <Compile Include="log4netAppender.cs" /> | ||
80 | <Compile Include="Program.cs" /> | ||
81 | <Compile Include="Properties\AssemblyInfo.cs" /> | ||
82 | <Compile Include="Properties\Resources.Designer.cs"> | ||
83 | <AutoGen>True</AutoGen> | ||
84 | <DesignTime>True</DesignTime> | ||
85 | <DependentUpon>Resources.resx</DependentUpon> | ||
86 | </Compile> | ||
87 | <Compile Include="Settings.cs" /> | ||
88 | </ItemGroup> | ||
89 | <ItemGroup> | ||
90 | <EmbeddedResource Include="GUI\WinForm\ProcessPanel.resx"> | ||
91 | <DependentUpon>ProcessPanel.cs</DependentUpon> | ||
92 | </EmbeddedResource> | ||
93 | <EmbeddedResource Include="GUI\WinForm\ucAppWindow.resx"> | ||
94 | <DependentUpon>ucAppWindow.cs</DependentUpon> | ||
95 | </EmbeddedResource> | ||
96 | <EmbeddedResource Include="GUI\WinForm\ucInputField.resx"> | ||
97 | <DependentUpon>ucInputField.cs</DependentUpon> | ||
98 | </EmbeddedResource> | ||
99 | <EmbeddedResource Include="GUI\WinForm\ucLogWindow.resx"> | ||
100 | <DependentUpon>ucLogWindow.cs</DependentUpon> | ||
101 | </EmbeddedResource> | ||
102 | </ItemGroup> | ||
103 | <ItemGroup> | ||
104 | <None Include="App.config" /> | ||
105 | </ItemGroup> | ||
106 | <ItemGroup> | ||
107 | <Content Include="GUI\WinForm\OpenSim Bottom Border.png" /> | ||
108 | <Content Include="GUI\WinForm\OpenSim Right Border.png" /> | ||
109 | <Content Include="GUI\WinForm\OpenSim.png" /> | ||
110 | <None Include="OpenSim.GridLaunch.ini"> | ||
111 | <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||
112 | </None> | ||
113 | <EmbeddedResource Include="Properties\Resources.resx"> | ||
114 | <Generator>ResXFileCodeGenerator</Generator> | ||
115 | <LastGenOutput>Resources.Designer.cs</LastGenOutput> | ||
116 | </EmbeddedResource> | ||
117 | </ItemGroup> | ||
118 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | ||
119 | <!-- To modify your build process, add your task inside one of the targets below and uncomment it. | ||
120 | Other similar extension points exist, see Microsoft.Common.targets. | ||
121 | <Target Name="BeforeBuild"> | ||
122 | </Target> | ||
123 | <Target Name="AfterBuild"> | ||
124 | </Target> | ||
125 | --> | ||
126 | </Project> \ No newline at end of file | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini new file mode 100644 index 0000000..c065898 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.ini | |||
@@ -0,0 +1,3 @@ | |||
1 | GUI=WinForm | ||
2 | ;GUI=TCPD | ||
3 | ;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 new file mode 100644 index 0000000..8f745e1 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/OpenSim.GridLaunch.sln | |||
@@ -0,0 +1,20 @@ | |||
1 | | ||
2 | Microsoft Visual Studio Solution File, Format Version 10.00 | ||
3 | # Visual Studio 2008 | ||
4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridLaunch", "OpenSim.GridLaunch.csproj", "{595D67F3-B413-4A43-8568-5B5930E3B31D}" | ||
5 | EndProject | ||
6 | Global | ||
7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
8 | Debug|Any CPU = Debug|Any CPU | ||
9 | Release|Any CPU = Release|Any CPU | ||
10 | EndGlobalSection | ||
11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
12 | {595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
13 | {595D67F3-B413-4A43-8568-5B5930E3B31D}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
14 | {595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
15 | {595D67F3-B413-4A43-8568-5B5930E3B31D}.Release|Any CPU.Build.0 = Release|Any CPU | ||
16 | EndGlobalSection | ||
17 | GlobalSection(SolutionProperties) = preSolution | ||
18 | HideSolutionNode = FALSE | ||
19 | EndGlobalSection | ||
20 | EndGlobal | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Program.cs b/OpenSim/Tools/OpenSim.GridLaunch/Program.cs new file mode 100644 index 0000000..5a0bb0c --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/Program.cs | |||
@@ -0,0 +1,245 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net; | ||
34 | using log4net.Appender; | ||
35 | using log4net.Repository.Hierarchy; | ||
36 | using OpenSim.GridLaunch.GUI; | ||
37 | using OpenSim.GridLaunch.GUI.Network; | ||
38 | |||
39 | namespace OpenSim.GridLaunch | ||
40 | { | ||
41 | class Program | ||
42 | { | ||
43 | public static readonly string ConfigFile = "OpenSim.GridLaunch.ini"; | ||
44 | internal static Dictionary<string, AppExecutor> AppList = new Dictionary<string, AppExecutor>(); | ||
45 | private static readonly int delayBetweenExecuteSeconds = 10; | ||
46 | //private static readonly int consoleReadIntervalMilliseconds = 50; | ||
47 | ////private static readonly Timer readTimer = new Timer(readConsole, null, Timeout.Infinite, Timeout.Infinite); | ||
48 | //private static Thread timerThread; | ||
49 | //private static object timerThreadLock = new object(); | ||
50 | private static IGUI GUIModule; | ||
51 | private static string GUIModuleName = ""; | ||
52 | public static readonly CommandProcessor Command = new CommandProcessor(); | ||
53 | public static readonly Settings Settings = new Settings(); | ||
54 | |||
55 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | |||
57 | public delegate void AppConsoleOutputDelegate(string App, string Text); | ||
58 | public static event AppConsoleOutputDelegate AppConsoleOutput; | ||
59 | public delegate void AppConsoleErrorDelegate(string App, string Text); | ||
60 | public static event AppConsoleErrorDelegate AppConsoleError; | ||
61 | public delegate void AppCreatedDelegate(string App); | ||
62 | public static event AppCreatedDelegate AppCreated; | ||
63 | public delegate void AppRemovedDelegate(string App); | ||
64 | public static event AppRemovedDelegate AppRemoved; | ||
65 | |||
66 | internal static void FireAppConsoleOutput(string App, string Text) | ||
67 | { | ||
68 | if (AppConsoleOutput != null) | ||
69 | AppConsoleOutput(App, Text); | ||
70 | } | ||
71 | internal static void FireAppConsoleError(string App, string Text) | ||
72 | { | ||
73 | if (AppConsoleError != null) | ||
74 | AppConsoleError(App, Text); | ||
75 | } | ||
76 | |||
77 | |||
78 | private static readonly object startStopLock = new object(); | ||
79 | |||
80 | public static string Name { get { return "OpenSim Grid executor"; } } | ||
81 | |||
82 | #region Start/Shutdown | ||
83 | static void Main(string[] args) | ||
84 | { | ||
85 | log4net.Config.XmlConfigurator.Configure(); | ||
86 | |||
87 | // Startup | ||
88 | m_log.Info(Name); | ||
89 | m_log.Info(new string('-', Name.Length)); | ||
90 | |||
91 | // Read settings | ||
92 | Settings.LoadConfig(ConfigFile); | ||
93 | // Command line arguments override settings | ||
94 | Settings.ParseCommandArguments(args); | ||
95 | |||
96 | // Start GUI module | ||
97 | StartGUIModule(); | ||
98 | |||
99 | // Start the processes | ||
100 | ThreadPool.QueueUserWorkItem(startProcesses); | ||
101 | |||
102 | // Hand over thread control to whatever GUI module | ||
103 | GUIModule.StartGUI(); | ||
104 | |||
105 | // GUI module returned, we are done | ||
106 | Shutdown(); | ||
107 | |||
108 | } | ||
109 | |||
110 | private static void StartGUIModule() | ||
111 | { | ||
112 | // Create GUI module | ||
113 | GUIModuleName = Settings["GUI"]; | ||
114 | |||
115 | switch (GUIModuleName.ToLower()) | ||
116 | { | ||
117 | case "winform": | ||
118 | GUIModuleName = "WinForm"; | ||
119 | GUIModule = new GUI.WinForm.ProcessPanel(); | ||
120 | break; | ||
121 | case "service": | ||
122 | GUIModuleName = "Service"; | ||
123 | GUIModule = new Service(); | ||
124 | break; | ||
125 | case "tcpd": | ||
126 | GUIModuleName = "TCPD"; | ||
127 | GUIModule = new TCPD(); | ||
128 | break; | ||
129 | case "console": | ||
130 | default: | ||
131 | GUIModuleName = "Console"; | ||
132 | GUIModule = new GUI.Console.Console(); | ||
133 | break; | ||
134 | } | ||
135 | m_log.Info("GUI type: " + GUIModuleName); | ||
136 | |||
137 | } | ||
138 | |||
139 | internal static void Shutdown() | ||
140 | { | ||
141 | // Stop the processes | ||
142 | stopProcesses(); | ||
143 | |||
144 | lock (startStopLock) | ||
145 | { | ||
146 | // Stop GUI module | ||
147 | if (GUIModule != null) | ||
148 | { | ||
149 | GUIModule.StopGUI(); | ||
150 | GUIModule = null; | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | |||
155 | internal static void SafeDisposeOf(object obj) | ||
156 | { | ||
157 | IDisposable o = obj as IDisposable; | ||
158 | try | ||
159 | { | ||
160 | if (o != null) | ||
161 | o.Dispose(); | ||
162 | } | ||
163 | catch { } | ||
164 | } | ||
165 | #endregion | ||
166 | |||
167 | #region Start / Stop applications | ||
168 | private static void startProcesses(Object stateInfo) | ||
169 | { | ||
170 | // Stop before starting | ||
171 | stopProcesses(); | ||
172 | |||
173 | // Start console read timer | ||
174 | //timer_Start(); | ||
175 | |||
176 | // Start the applications | ||
177 | foreach (string file in new ArrayList(Settings.Components.Keys)) | ||
178 | { | ||
179 | // Is this file marked for startup? | ||
180 | if (Settings.Components[file]) | ||
181 | { | ||
182 | AppExecutor app = new AppExecutor(file); | ||
183 | app.Start(); | ||
184 | AppList.Add(file, app); | ||
185 | if (AppCreated != null) | ||
186 | AppCreated(app.File); | ||
187 | System.Threading.Thread.Sleep(1000*delayBetweenExecuteSeconds); | ||
188 | } | ||
189 | } | ||
190 | } | ||
191 | |||
192 | private static void stopProcesses() | ||
193 | { | ||
194 | // Stop timer | ||
195 | //timer_Stop(); | ||
196 | |||
197 | // Lock so we don't collide with any timer still executing on AppList | ||
198 | lock (AppList) | ||
199 | { | ||
200 | // Start the applications | ||
201 | foreach (AppExecutor app in AppList.Values) | ||
202 | { | ||
203 | try | ||
204 | { | ||
205 | m_log.Info("Stopping: " + app.File); | ||
206 | app.Stop(); | ||
207 | } | ||
208 | catch (Exception ex) | ||
209 | { | ||
210 | m_log.ErrorFormat("Exception while stopping \"{0}\": {1}", app.File, ex.ToString()); | ||
211 | } | ||
212 | finally | ||
213 | { | ||
214 | if (AppRemoved != null) | ||
215 | AppRemoved(app.File); | ||
216 | app.Dispose(); | ||
217 | } | ||
218 | |||
219 | } | ||
220 | AppList.Clear(); | ||
221 | } | ||
222 | } | ||
223 | #endregion | ||
224 | |||
225 | public static void Write(string App, string Text) | ||
226 | { | ||
227 | // Check if it is a commands | ||
228 | bool isCommand = Command.Process(App, Text); | ||
229 | |||
230 | // Write to stdInput of app | ||
231 | if (!isCommand && AppList.ContainsKey(App)) | ||
232 | AppList[App].Write(Text); | ||
233 | } | ||
234 | |||
235 | public static void WriteLine(string App, string Text) | ||
236 | { | ||
237 | // Check if it is a commands | ||
238 | bool isCommand = Command.Process(App, Text); | ||
239 | |||
240 | // Write to stdInput of app | ||
241 | if (!isCommand && AppList.ContainsKey(App)) | ||
242 | AppList[App].WriteLine(Text); | ||
243 | } | ||
244 | } | ||
245 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs b/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4c300d0 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/Properties/AssemblyInfo.cs | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using System.Runtime.CompilerServices; | ||
30 | using System.Runtime.InteropServices; | ||
31 | |||
32 | // General information about an assembly is controlled through the following | ||
33 | // set of attributes. Change these attribute values to modify the information | ||
34 | // associated with an assembly. | ||
35 | [assembly: AssemblyTitle("OpenSim.GridLaunch")] | ||
36 | [assembly: AssemblyDescription("")] | ||
37 | [assembly: AssemblyConfiguration("")] | ||
38 | [assembly: AssemblyCompany("")] | ||
39 | [assembly: AssemblyProduct("OpenSim.GridLaunch")] | ||
40 | [assembly: AssemblyCopyright("Copyright (c) 2008")] | ||
41 | [assembly: AssemblyTrademark("")] | ||
42 | [assembly: AssemblyCulture("")] | ||
43 | |||
44 | // Setting ComVisible to false makes the types in this assembly not visible | ||
45 | // to COM components. If you need to access a type in this assembly from | ||
46 | // COM, set the ComVisible attribute to true on that type. | ||
47 | [assembly: ComVisible(false)] | ||
48 | |||
49 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
50 | [assembly: Guid("5072e919-46ab-47e6-8a63-08108324ccdf")] | ||
51 | |||
52 | // Version information for an assembly consists of the following four values: | ||
53 | // | ||
54 | // Major Version | ||
55 | // Minor Version | ||
56 | // Build Number | ||
57 | // Revision | ||
58 | // | ||
59 | // You can specify all the values or you can default the Build and Revision Numbers | ||
60 | // by using the '*' as shown below: | ||
61 | // [assembly: AssemblyVersion("1.0.*")] | ||
62 | [assembly: AssemblyVersion("1.0.0.0")] | ||
63 | [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 new file mode 100644 index 0000000..88b0ceb --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.Designer.cs | |||
@@ -0,0 +1,84 @@ | |||
1 | //------------------------------------------------------------------------------ | ||
2 | // <auto-generated> | ||
3 | // This code was generated by a tool. | ||
4 | // Runtime Version:2.0.50727.3053 | ||
5 | // | ||
6 | // Changes to this file may cause incorrect behavior and will be lost if | ||
7 | // the code is regenerated. | ||
8 | // </auto-generated> | ||
9 | //------------------------------------------------------------------------------ | ||
10 | |||
11 | namespace OpenSim.GridLaunch.Properties { | ||
12 | using System; | ||
13 | |||
14 | |||
15 | /// <summary> | ||
16 | /// A strongly-typed resource class, for looking up localized strings, etc. | ||
17 | /// </summary> | ||
18 | // This class was auto-generated by the StronglyTypedResourceBuilder | ||
19 | // class via a tool like ResGen or Visual Studio. | ||
20 | // To add or remove a member, edit your .ResX file then rerun ResGen | ||
21 | // with the /str option, or rebuild your VS project. | ||
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] | ||
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] | ||
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | ||
25 | internal class Resources { | ||
26 | |||
27 | private static global::System.Resources.ResourceManager resourceMan; | ||
28 | |||
29 | private static global::System.Globalization.CultureInfo resourceCulture; | ||
30 | |||
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] | ||
32 | internal Resources() { | ||
33 | } | ||
34 | |||
35 | /// <summary> | ||
36 | /// Returns the cached ResourceManager instance used by this class. | ||
37 | /// </summary> | ||
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | ||
39 | internal static global::System.Resources.ResourceManager ResourceManager { | ||
40 | get { | ||
41 | if (object.ReferenceEquals(resourceMan, null)) { | ||
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenSim.GridLaunch.Properties.Resources", typeof(Resources).Assembly); | ||
43 | resourceMan = temp; | ||
44 | } | ||
45 | return resourceMan; | ||
46 | } | ||
47 | } | ||
48 | |||
49 | /// <summary> | ||
50 | /// Overrides the current thread's CurrentUICulture property for all | ||
51 | /// resource lookups using this strongly typed resource class. | ||
52 | /// </summary> | ||
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] | ||
54 | internal static global::System.Globalization.CultureInfo Culture { | ||
55 | get { | ||
56 | return resourceCulture; | ||
57 | } | ||
58 | set { | ||
59 | resourceCulture = value; | ||
60 | } | ||
61 | } | ||
62 | |||
63 | internal static System.Drawing.Bitmap OpenSim { | ||
64 | get { | ||
65 | object obj = ResourceManager.GetObject("OpenSim", resourceCulture); | ||
66 | return ((System.Drawing.Bitmap)(obj)); | ||
67 | } | ||
68 | } | ||
69 | |||
70 | internal static System.Drawing.Bitmap OpenSim_Bottom_Border { | ||
71 | get { | ||
72 | object obj = ResourceManager.GetObject("OpenSim_Bottom_Border", resourceCulture); | ||
73 | return ((System.Drawing.Bitmap)(obj)); | ||
74 | } | ||
75 | } | ||
76 | |||
77 | internal static System.Drawing.Bitmap OpenSim_Right_Border { | ||
78 | get { | ||
79 | object obj = ResourceManager.GetObject("OpenSim_Right_Border", resourceCulture); | ||
80 | return ((System.Drawing.Bitmap)(obj)); | ||
81 | } | ||
82 | } | ||
83 | } | ||
84 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx b/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx new file mode 100644 index 0000000..b82a1fc --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/Properties/Resources.resx | |||
@@ -0,0 +1,130 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <root> | ||
3 | <!-- | ||
4 | Microsoft ResX Schema | ||
5 | |||
6 | Version 2.0 | ||
7 | |||
8 | The primary goals of this format is to allow a simple XML format | ||
9 | that is mostly human readable. The generation and parsing of the | ||
10 | various data types are done through the TypeConverter classes | ||
11 | associated with the data types. | ||
12 | |||
13 | Example: | ||
14 | |||
15 | ... ado.net/XML headers & schema ... | ||
16 | <resheader name="resmimetype">text/microsoft-resx</resheader> | ||
17 | <resheader name="version">2.0</resheader> | ||
18 | <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||
19 | <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||
20 | <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||
21 | <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||
22 | <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||
23 | <value>[base64 mime encoded serialized .NET Framework object]</value> | ||
24 | </data> | ||
25 | <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||
26 | <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||
27 | <comment>This is a comment</comment> | ||
28 | </data> | ||
29 | |||
30 | There are any number of "resheader" rows that contain simple | ||
31 | name/value pairs. | ||
32 | |||
33 | Each data row contains a name, and value. The row also contains a | ||
34 | type or mimetype. Type corresponds to a .NET class that support | ||
35 | text/value conversion through the TypeConverter architecture. | ||
36 | Classes that don't support this are serialized and stored with the | ||
37 | mimetype set. | ||
38 | |||
39 | The mimetype is used for serialized objects, and tells the | ||
40 | ResXResourceReader how to depersist the object. This is currently not | ||
41 | extensible. For a given mimetype the value must be set accordingly: | ||
42 | |||
43 | Note - application/x-microsoft.net.object.binary.base64 is the format | ||
44 | that the ResXResourceWriter will generate, however the reader can | ||
45 | read any of the formats listed below. | ||
46 | |||
47 | mimetype: application/x-microsoft.net.object.binary.base64 | ||
48 | value : The object must be serialized with | ||
49 | : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter | ||
50 | : and then encoded with base64 encoding. | ||
51 | |||
52 | mimetype: application/x-microsoft.net.object.soap.base64 | ||
53 | value : The object must be serialized with | ||
54 | : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||
55 | : and then encoded with base64 encoding. | ||
56 | |||
57 | mimetype: application/x-microsoft.net.object.bytearray.base64 | ||
58 | value : The object must be serialized into a byte array | ||
59 | : using a System.ComponentModel.TypeConverter | ||
60 | : and then encoded with base64 encoding. | ||
61 | --> | ||
62 | <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||
63 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> | ||
64 | <xsd:element name="root" msdata:IsDataSet="true"> | ||
65 | <xsd:complexType> | ||
66 | <xsd:choice maxOccurs="unbounded"> | ||
67 | <xsd:element name="metadata"> | ||
68 | <xsd:complexType> | ||
69 | <xsd:sequence> | ||
70 | <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||
71 | </xsd:sequence> | ||
72 | <xsd:attribute name="name" use="required" type="xsd:string" /> | ||
73 | <xsd:attribute name="type" type="xsd:string" /> | ||
74 | <xsd:attribute name="mimetype" type="xsd:string" /> | ||
75 | <xsd:attribute ref="xml:space" /> | ||
76 | </xsd:complexType> | ||
77 | </xsd:element> | ||
78 | <xsd:element name="assembly"> | ||
79 | <xsd:complexType> | ||
80 | <xsd:attribute name="alias" type="xsd:string" /> | ||
81 | <xsd:attribute name="name" type="xsd:string" /> | ||
82 | </xsd:complexType> | ||
83 | </xsd:element> | ||
84 | <xsd:element name="data"> | ||
85 | <xsd:complexType> | ||
86 | <xsd:sequence> | ||
87 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
88 | <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||
89 | </xsd:sequence> | ||
90 | <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> | ||
91 | <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||
92 | <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||
93 | <xsd:attribute ref="xml:space" /> | ||
94 | </xsd:complexType> | ||
95 | </xsd:element> | ||
96 | <xsd:element name="resheader"> | ||
97 | <xsd:complexType> | ||
98 | <xsd:sequence> | ||
99 | <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||
100 | </xsd:sequence> | ||
101 | <xsd:attribute name="name" type="xsd:string" use="required" /> | ||
102 | </xsd:complexType> | ||
103 | </xsd:element> | ||
104 | </xsd:choice> | ||
105 | </xsd:complexType> | ||
106 | </xsd:element> | ||
107 | </xsd:schema> | ||
108 | <resheader name="resmimetype"> | ||
109 | <value>text/microsoft-resx</value> | ||
110 | </resheader> | ||
111 | <resheader name="version"> | ||
112 | <value>2.0</value> | ||
113 | </resheader> | ||
114 | <resheader name="reader"> | ||
115 | <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
116 | </resheader> | ||
117 | <resheader name="writer"> | ||
118 | <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||
119 | </resheader> | ||
120 | <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> | ||
121 | <data name="OpenSim" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||
122 | <value>..\gui\winform\opensim.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> | ||
123 | </data> | ||
124 | <data name="OpenSim_Bottom_Border" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||
125 | <value>..\gui\winform\opensim bottom border.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> | ||
126 | </data> | ||
127 | <data name="OpenSim_Right_Border" type="System.Resources.ResXFileRef, System.Windows.Forms"> | ||
128 | <value>..\gui\winform\opensim right border.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> | ||
129 | </data> | ||
130 | </root> \ No newline at end of file | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs b/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs new file mode 100644 index 0000000..91353d8 --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/Settings.cs | |||
@@ -0,0 +1,181 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Reflection; | ||
30 | using System.Text; | ||
31 | using log4net; | ||
32 | |||
33 | namespace OpenSim.GridLaunch | ||
34 | { | ||
35 | internal class Settings | ||
36 | { | ||
37 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
38 | private Dictionary<string, string> Config = new Dictionary<string, string>(); | ||
39 | public Dictionary<string, bool> Components = new Dictionary<string, bool>(); | ||
40 | |||
41 | public static string[] defaultComponents = new string[] | ||
42 | { | ||
43 | "OpenSim.Grid.UserServer.exe", | ||
44 | "OpenSim.Grid.GridServer.exe", | ||
45 | "OpenSim.Grid.AssetServer.exe", | ||
46 | "OpenSim.Grid.InventoryServer.exe", | ||
47 | "OpenSim.Grid.MessagingServer.exe", | ||
48 | "OpenSim.32BitLaunch.exe" | ||
49 | }; | ||
50 | |||
51 | |||
52 | private static readonly char[] confSplit = new char[] { '=' }; | ||
53 | private static readonly char[] comaSplit = new char[] { ',' }; | ||
54 | private static readonly char[] colonSplit = new char[] { ';' }; | ||
55 | |||
56 | private string configFile = ""; | ||
57 | |||
58 | public Settings() | ||
59 | { | ||
60 | } | ||
61 | public Settings(string ConfigFile) | ||
62 | { | ||
63 | LoadConfig(ConfigFile); | ||
64 | } | ||
65 | |||
66 | |||
67 | public void LoadConfig(string ConfigFile) | ||
68 | { | ||
69 | configFile = ConfigFile; | ||
70 | m_log.Info("Reading config file: " + ConfigFile); | ||
71 | try | ||
72 | { | ||
73 | // Read config file | ||
74 | foreach (string line in System.IO.File.ReadAllLines(ConfigFile)) | ||
75 | { | ||
76 | string[] s = line.Split(confSplit, 2); | ||
77 | if (s.Length >= 2) | ||
78 | Config.Add(s[0], s[1]); | ||
79 | } | ||
80 | |||
81 | // Process Components section | ||
82 | string cmp = Config["Components"]; | ||
83 | Config.Remove("Components"); | ||
84 | foreach (string c in cmp.Split(comaSplit)) | ||
85 | { | ||
86 | string[] cs = c.Split(colonSplit); | ||
87 | if (cs.Length >= 2) | ||
88 | { | ||
89 | bool status = false; | ||
90 | bool.TryParse(cs[1], out status); | ||
91 | Components.Add(cs[0], status); | ||
92 | } | ||
93 | } | ||
94 | } | ||
95 | catch (Exception ex) | ||
96 | { | ||
97 | m_log.Error("Exception reading config file: " + ex.ToString()); | ||
98 | } | ||
99 | // No components? Add default components | ||
100 | if (Components.Count == 0) | ||
101 | foreach (string c in defaultComponents) | ||
102 | { | ||
103 | Components.Add(c, true); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | public void SaveConfig(string ConfigFile) | ||
108 | { | ||
109 | configFile = ConfigFile; | ||
110 | SaveConfig(); | ||
111 | } | ||
112 | |||
113 | public void SaveConfig() | ||
114 | { | ||
115 | m_log.Info("Writing config file: " + configFile); | ||
116 | try | ||
117 | { | ||
118 | System.IO.File.WriteAllText(configFile, ToString()); | ||
119 | } | ||
120 | catch (Exception ex) | ||
121 | { | ||
122 | m_log.Error("Exception writing config file: " + ex.ToString()); | ||
123 | } | ||
124 | |||
125 | } | ||
126 | |||
127 | public new string ToString() | ||
128 | { | ||
129 | StringBuilder ret = new StringBuilder(); | ||
130 | |||
131 | Dictionary<string, string> config = new Dictionary<string, string>(Config); | ||
132 | |||
133 | // Add Components key | ||
134 | StringBuilder _Components = new StringBuilder(); | ||
135 | foreach (string c in Components.Keys) | ||
136 | { | ||
137 | if (_Components.Length > 0) | ||
138 | _Components.Append(","); | ||
139 | _Components.Append(c + ";" + Components[c].ToString()); | ||
140 | } | ||
141 | config["Components"] = _Components.ToString(); | ||
142 | |||
143 | // Make return string | ||
144 | foreach (string key in config.Keys) | ||
145 | { | ||
146 | ret.AppendLine(key + "=" + config[key]); | ||
147 | } | ||
148 | |||
149 | // Return it | ||
150 | return ret.ToString(); | ||
151 | } | ||
152 | |||
153 | public string this[string Key] | ||
154 | { | ||
155 | get | ||
156 | { | ||
157 | if (Config.ContainsKey(Key)) | ||
158 | return Config[Key]; | ||
159 | return ""; | ||
160 | } | ||
161 | set { Config[Key] = value; } | ||
162 | } | ||
163 | |||
164 | public void ParseCommandArguments(string[] args) | ||
165 | { | ||
166 | string key = null; | ||
167 | foreach (string a in args) | ||
168 | { | ||
169 | if (a.StartsWith("--")) | ||
170 | key = a.Remove(0, 2); | ||
171 | else | ||
172 | { | ||
173 | if (key != null) | ||
174 | Config[key] = a; | ||
175 | key = null; | ||
176 | } | ||
177 | } | ||
178 | |||
179 | } | ||
180 | } | ||
181 | } | ||
diff --git a/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs b/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs new file mode 100644 index 0000000..d9bea1a --- /dev/null +++ b/OpenSim/Tools/OpenSim.GridLaunch/log4netAppender.cs | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using System.Collections.Generic; | ||
29 | using System.Drawing; | ||
30 | using System.Text; | ||
31 | using System.Windows.Forms; | ||
32 | using log4net.Appender; | ||
33 | using log4net.Core; | ||
34 | |||
35 | namespace OpenSim.GridLaunch | ||
36 | { | ||
37 | internal class log4netAppender : log4net.Appender.AppenderSkeleton | ||
38 | { | ||
39 | public delegate void LogLineDelegate(Color color, string Text); | ||
40 | public static event LogLineDelegate LogLine; | ||
41 | public static readonly Dictionary<string, Color> Level2Color = new Dictionary<string, Color>(); | ||
42 | |||
43 | static log4netAppender() | ||
44 | { | ||
45 | Level2Color.Add("INFO", Color.Black); | ||
46 | Level2Color.Add("DEBUG", Color.Gray); | ||
47 | Level2Color.Add("WARN", Color.OrangeRed); | ||
48 | Level2Color.Add("ERROR", Color.Red); | ||
49 | } | ||
50 | |||
51 | |||
52 | protected override void Append(LoggingEvent loggingEvent) | ||
53 | { | ||
54 | // Find appropriate color | ||
55 | Color color = Color.Black; | ||
56 | if (Level2Color.ContainsKey(loggingEvent.Level.Name)) | ||
57 | color = Level2Color[loggingEvent.Level.Name]; | ||
58 | |||
59 | // Fire event with new log message | ||
60 | if (LogLine != null) | ||
61 | LogLine(color, loggingEvent.RenderedMessage + System.Environment.NewLine); | ||
62 | } | ||
63 | |||
64 | } | ||
65 | } | ||