diff options
Diffstat (limited to 'OpenSim.RegionServer/OpenSimMain.cs')
-rw-r--r-- | OpenSim.RegionServer/OpenSimMain.cs | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/OpenSim.RegionServer/OpenSimMain.cs b/OpenSim.RegionServer/OpenSimMain.cs new file mode 100644 index 0000000..b2bc0b3 --- /dev/null +++ b/OpenSim.RegionServer/OpenSimMain.cs | |||
@@ -0,0 +1,320 @@ | |||
1 | /* | ||
2 | Copyright (c) OpenSim project, http://osgrid.org/ | ||
3 | |||
4 | * All rights reserved. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions are met: | ||
8 | * * Redistributions of source code must retain the above copyright | ||
9 | * notice, this list of conditions and the following disclaimer. | ||
10 | * * Redistributions in binary form must reproduce the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer in the | ||
12 | * documentation and/or other materials provided with the distribution. | ||
13 | * * Neither the name of the <organization> nor the | ||
14 | * names of its contributors may be used to endorse or promote products | ||
15 | * derived from this software without specific prior written permission. | ||
16 | * | ||
17 | * THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY | ||
18 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
19 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
20 | * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY | ||
21 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
22 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
23 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
24 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
26 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
27 | */ | ||
28 | |||
29 | using System; | ||
30 | using System.Text; | ||
31 | using System.IO; | ||
32 | using System.Threading; | ||
33 | using System.Net; | ||
34 | using System.Net.Sockets; | ||
35 | using System.Timers; | ||
36 | using System.Reflection; | ||
37 | using System.Collections; | ||
38 | using System.Collections.Generic; | ||
39 | using libsecondlife; | ||
40 | using libsecondlife.Packets; | ||
41 | using OpenSim.world; | ||
42 | using OpenSim.Framework.Interfaces; | ||
43 | using OpenSim.UserServer; | ||
44 | using OpenSim.Assets; | ||
45 | using OpenSim.CAPS; | ||
46 | using OpenSim.Framework.Console; | ||
47 | using OpenSim.Physics.Manager; | ||
48 | |||
49 | namespace OpenSim | ||
50 | { | ||
51 | /// <summary> | ||
52 | /// | ||
53 | /// </summary> | ||
54 | public class OpenSimMain : OpenSimApplication | ||
55 | { | ||
56 | private Dictionary<EndPoint, uint> clientCircuits = new Dictionary<EndPoint, uint>(); | ||
57 | private PhysicsManager physManager; | ||
58 | |||
59 | public Socket Server; | ||
60 | private IPEndPoint ServerIncoming; | ||
61 | private byte[] RecvBuffer = new byte[4096]; | ||
62 | private byte[] ZeroBuffer = new byte[8192]; | ||
63 | private IPEndPoint ipeSender; | ||
64 | private EndPoint epSender; | ||
65 | private AsyncCallback ReceivedData; | ||
66 | |||
67 | private System.Timers.Timer timer1 = new System.Timers.Timer(); | ||
68 | private string ConfigDll = "OpenSim.Config.SimConfigDb4o.dll"; | ||
69 | private string _physicsEngine = "basicphysics"; | ||
70 | public bool sandbox = false; | ||
71 | public bool loginserver = false; | ||
72 | |||
73 | [STAThread] | ||
74 | public static void Main(string[] args) | ||
75 | { | ||
76 | Console.WriteLine("OpenSim " + VersionInfo.Version + "\n"); | ||
77 | Console.WriteLine("Starting...\n"); | ||
78 | OpenSim.Framework.Console.MainConsole.Instance = new SimConsole(OpenSim.Framework.Console.ConsoleBase.ConsoleType.Local, "", 0); | ||
79 | |||
80 | //OpenSimRoot.instance = new OpenSimRoot(); | ||
81 | OpenSimMain sim = new OpenSimMain(); | ||
82 | OpenSimRoot.Instance.Application = sim; | ||
83 | |||
84 | sim.sandbox = false; | ||
85 | sim.loginserver = false; | ||
86 | sim._physicsEngine = "basicphysics"; | ||
87 | |||
88 | for (int i = 0; i < args.Length; i++) | ||
89 | { | ||
90 | if (args[i] == "-sandbox") | ||
91 | { | ||
92 | sim.sandbox = true; | ||
93 | OpenSimRoot.Instance.Sandbox = true; | ||
94 | } | ||
95 | |||
96 | if (args[i] == "-loginserver") | ||
97 | { | ||
98 | sim.loginserver = true; | ||
99 | } | ||
100 | if (args[i] == "-realphysx") | ||
101 | { | ||
102 | sim._physicsEngine = "RealPhysX"; | ||
103 | OpenSim.world.Avatar.PhysicsEngineFlying = true; | ||
104 | } | ||
105 | } | ||
106 | |||
107 | |||
108 | OpenSimRoot.Instance.GridServers = new Grid(); | ||
109 | if (sim.sandbox) | ||
110 | { | ||
111 | OpenSimRoot.Instance.GridServers.AssetDll = "OpenSim.GridInterfaces.Local.dll"; | ||
112 | OpenSimRoot.Instance.GridServers.GridDll = "OpenSim.GridInterfaces.Local.dll"; | ||
113 | OpenSimRoot.Instance.GridServers.Initialise(); | ||
114 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting in Sandbox mode"); | ||
115 | } | ||
116 | else | ||
117 | { | ||
118 | OpenSimRoot.Instance.GridServers.AssetDll = "OpenSim.GridInterfaces.Remote.dll"; | ||
119 | OpenSimRoot.Instance.GridServers.GridDll = "OpenSim.GridInterfaces.Remote.dll"; | ||
120 | OpenSimRoot.Instance.GridServers.Initialise(); | ||
121 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting in Grid mode"); | ||
122 | } | ||
123 | |||
124 | if (sim.loginserver && sim.sandbox) | ||
125 | { | ||
126 | LoginServer loginServer = new LoginServer(OpenSimRoot.Instance.GridServers.GridServer); | ||
127 | loginServer.Startup(); | ||
128 | } | ||
129 | |||
130 | OpenSimRoot.Instance.StartUp(); | ||
131 | |||
132 | while (true) | ||
133 | { | ||
134 | OpenSim.Framework.Console.MainConsole.Instance.MainConsolePrompt(); | ||
135 | } | ||
136 | } | ||
137 | |||
138 | private OpenSimMain() | ||
139 | { | ||
140 | } | ||
141 | |||
142 | public override void StartUp() | ||
143 | { | ||
144 | OpenSimRoot.Instance.startuptime = DateTime.Now; | ||
145 | |||
146 | OpenSimRoot.Instance.AssetCache = new AssetCache(OpenSimRoot.Instance.GridServers.AssetServer); | ||
147 | OpenSimRoot.Instance.InventoryCache = new InventoryCache(); | ||
148 | |||
149 | // We check our local database first, then the grid for config options | ||
150 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration"); | ||
151 | OpenSimRoot.Instance.Cfg = this.LoadConfigDll(this.ConfigDll); | ||
152 | OpenSimRoot.Instance.Cfg.InitConfig(this.sandbox); | ||
153 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver"); | ||
154 | OpenSimRoot.Instance.Cfg.LoadFromGrid(); | ||
155 | |||
156 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - We are " + OpenSimRoot.Instance.Cfg.RegionName + " at " + OpenSimRoot.Instance.Cfg.RegionLocX.ToString() + "," + OpenSimRoot.Instance.Cfg.RegionLocY.ToString()); | ||
157 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Initialising world"); | ||
158 | OpenSimRoot.Instance.LocalWorld = new World(); | ||
159 | OpenSimRoot.Instance.LocalWorld.LandMap = OpenSimRoot.Instance.Cfg.LoadWorld(); | ||
160 | |||
161 | this.physManager = new OpenSim.Physics.Manager.PhysicsManager(); | ||
162 | this.physManager.LoadPlugins(); | ||
163 | |||
164 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system"); | ||
165 | OpenSimRoot.Instance.LocalWorld.PhysScene = this.physManager.GetPhysicsScene(this._physicsEngine); //should be reading from the config file what physics engine to use | ||
166 | OpenSimRoot.Instance.LocalWorld.PhysScene.SetTerrain(OpenSimRoot.Instance.LocalWorld.LandMap); | ||
167 | |||
168 | OpenSimRoot.Instance.GridServers.AssetServer.SetServerInfo(OpenSimRoot.Instance.Cfg.AssetURL, OpenSimRoot.Instance.Cfg.AssetSendKey); | ||
169 | OpenSimRoot.Instance.GridServers.GridServer.SetServerInfo(OpenSimRoot.Instance.Cfg.GridURL, OpenSimRoot.Instance.Cfg.GridSendKey, OpenSimRoot.Instance.Cfg.GridRecvKey); | ||
170 | |||
171 | OpenSimRoot.Instance.LocalWorld.LoadStorageDLL("OpenSim.Storage.LocalStorageDb4o.dll"); //all these dll names shouldn't be hard coded. | ||
172 | OpenSimRoot.Instance.LocalWorld.LoadPrimsFromStorage(); | ||
173 | |||
174 | if (this.sandbox) | ||
175 | { | ||
176 | OpenSimRoot.Instance.AssetCache.LoadDefaultTextureSet(); | ||
177 | } | ||
178 | |||
179 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting CAPS HTTP server"); | ||
180 | OpenSimRoot.Instance.HttpServer = new SimCAPSHTTPServer(); | ||
181 | |||
182 | timer1.Enabled = true; | ||
183 | timer1.Interval = 100; | ||
184 | timer1.Elapsed += new ElapsedEventHandler(this.Timer1Tick); | ||
185 | |||
186 | MainServerListener(); | ||
187 | } | ||
188 | |||
189 | private SimConfig LoadConfigDll(string dllName) | ||
190 | { | ||
191 | Assembly pluginAssembly = Assembly.LoadFrom(dllName); | ||
192 | SimConfig config = null; | ||
193 | |||
194 | foreach (Type pluginType in pluginAssembly.GetTypes()) | ||
195 | { | ||
196 | if (pluginType.IsPublic) | ||
197 | { | ||
198 | if (!pluginType.IsAbstract) | ||
199 | { | ||
200 | Type typeInterface = pluginType.GetInterface("ISimConfig", true); | ||
201 | |||
202 | if (typeInterface != null) | ||
203 | { | ||
204 | ISimConfig plug = (ISimConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); | ||
205 | config = plug.GetConfigObject(); | ||
206 | break; | ||
207 | } | ||
208 | |||
209 | typeInterface = null; | ||
210 | } | ||
211 | } | ||
212 | } | ||
213 | pluginAssembly = null; | ||
214 | return config; | ||
215 | } | ||
216 | |||
217 | private void OnReceivedData(IAsyncResult result) | ||
218 | { | ||
219 | ipeSender = new IPEndPoint(IPAddress.Any, 0); | ||
220 | epSender = (EndPoint)ipeSender; | ||
221 | Packet packet = null; | ||
222 | int numBytes = Server.EndReceiveFrom(result, ref epSender); | ||
223 | int packetEnd = numBytes - 1; | ||
224 | packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); | ||
225 | |||
226 | // This is either a new client or a packet to send to an old one | ||
227 | // if (OpenSimRoot.Instance.ClientThreads.ContainsKey(epSender)) | ||
228 | |||
229 | // do we already have a circuit for this endpoint | ||
230 | if(this.clientCircuits.ContainsKey(epSender)) | ||
231 | { | ||
232 | OpenSimRoot.Instance.ClientThreads[this.clientCircuits[epSender]].InPacket(packet); | ||
233 | } | ||
234 | else if (packet.Type == PacketType.UseCircuitCode) | ||
235 | { // new client | ||
236 | UseCircuitCodePacket useCircuit = (UseCircuitCodePacket)packet; | ||
237 | this.clientCircuits.Add(epSender, useCircuit.CircuitCode.Code); | ||
238 | SimClient newuser = new SimClient(epSender, useCircuit); | ||
239 | //OpenSimRoot.Instance.ClientThreads.Add(epSender, newuser); | ||
240 | OpenSimRoot.Instance.ClientThreads.Add(useCircuit.CircuitCode.Code, newuser); | ||
241 | } | ||
242 | else | ||
243 | { // invalid client | ||
244 | Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString()); | ||
245 | } | ||
246 | Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); | ||
247 | } | ||
248 | |||
249 | private void MainServerListener() | ||
250 | { | ||
251 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - New thread started"); | ||
252 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + OpenSimRoot.Instance.Cfg.IPListenAddr + ":" + OpenSimRoot.Instance.Cfg.IPListenPort); | ||
253 | |||
254 | ServerIncoming = new IPEndPoint(IPAddress.Any, OpenSimRoot.Instance.Cfg.IPListenPort); | ||
255 | Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); | ||
256 | Server.Bind(ServerIncoming); | ||
257 | |||
258 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen"); | ||
259 | |||
260 | ipeSender = new IPEndPoint(IPAddress.Any, 0); | ||
261 | epSender = (EndPoint)ipeSender; | ||
262 | ReceivedData = new AsyncCallback(this.OnReceivedData); | ||
263 | Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); | ||
264 | |||
265 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Listening..."); | ||
266 | |||
267 | } | ||
268 | |||
269 | public override void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode )//EndPoint packetSender) | ||
270 | { | ||
271 | // find the endpoint for this circuit | ||
272 | EndPoint sendto = null; | ||
273 | foreach(KeyValuePair<EndPoint, uint> p in this.clientCircuits) | ||
274 | { | ||
275 | if (p.Value == circuitcode) | ||
276 | { | ||
277 | sendto = p.Key; | ||
278 | break; | ||
279 | } | ||
280 | } | ||
281 | if (sendto != null) | ||
282 | { | ||
283 | //we found the endpoint so send the packet to it | ||
284 | this.Server.SendTo(buffer, size, flags, sendto); | ||
285 | } | ||
286 | } | ||
287 | |||
288 | public override void RemoveClientCircuit(uint circuitcode) | ||
289 | { | ||
290 | foreach (KeyValuePair<EndPoint, uint> p in this.clientCircuits) | ||
291 | { | ||
292 | if (p.Value == circuitcode) | ||
293 | { | ||
294 | this.clientCircuits.Remove(p.Key); | ||
295 | break; | ||
296 | } | ||
297 | } | ||
298 | } | ||
299 | |||
300 | public override void Shutdown() | ||
301 | { | ||
302 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing all threads"); | ||
303 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing listener thread"); | ||
304 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing clients"); | ||
305 | // IMPLEMENT THIS | ||
306 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing console and terminating"); | ||
307 | OpenSimRoot.Instance.LocalWorld.Close(); | ||
308 | OpenSimRoot.Instance.GridServers.Close(); | ||
309 | OpenSim.Framework.Console.MainConsole.Instance.Close(); | ||
310 | Environment.Exit(0); | ||
311 | } | ||
312 | |||
313 | void Timer1Tick(object sender, System.EventArgs e) | ||
314 | { | ||
315 | OpenSimRoot.Instance.LocalWorld.Update(); | ||
316 | } | ||
317 | } | ||
318 | |||
319 | |||
320 | } | ||