123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- Copyright (c) OpenSim project, http://osgrid.org/
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the <organization> nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- using System;
- using System.Text;
- using System.IO;
- using System.Threading;
- using System.Net;
- using System.Net.Sockets;
- using System.Timers;
- using System.Collections;
- using System.Collections.Generic;
- using libsecondlife;
- using libsecondlife.Packets;
- using OpenSim.world;
- using OpenSim.GridServers;
- using OpenSim.Assets;
- using PhysicsSystem;
- namespace OpenSim
- {
- /// <summary>
- /// Description of MainForm.
- /// </summary>
- public class OpenSim_Main
- {
- public static OpenSim_Main sim;
- public static SimConfig cfg;
- public static World local_world;
- public static Grid gridServers;
- public static AssetCache assetCache;
- //private static Thread MainListener;
- //private static Thread PingRespponder;
- public static Socket Server;
- private static IPEndPoint ServerIncoming;
- private static byte[] RecvBuffer = new byte[4096];
- private byte[] ZeroBuffer = new byte[8192];
- private static IPEndPoint ipeSender;
- private static EndPoint epSender;
- private static AsyncCallback ReceivedData;
- public Dictionary<EndPoint, OpenSimClient> ClientThreads = new Dictionary<EndPoint, OpenSimClient>();
- private PhysicsManager physManager;
- private System.Timers.Timer timer1 = new System.Timers.Timer();
-
- [STAThread]
- public static void Main( string[] args )
- {
- //Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
- Console.WriteLine("Starting...\n");
- sim = new OpenSim_Main();
-
- bool sandbox = false;
- bool loginserver = false;
- for (int i = 0; i < args.Length; i++)
- {
- if(args[i] == "-sandbox")
- {
- sandbox = true;
- }
- if(args[i] == "-loginserver")
- {
- loginserver = true;
- }
- }
- if(sandbox)
- {
- OpenSim_Main.gridServers = new Grid(true);
- Console.WriteLine("Starting in Sandbox mode");
- }
- else
- {
- OpenSim_Main.gridServers = new Grid(false);
- Console.WriteLine("Starting in Grid mode");
- }
- if(loginserver && sandbox)
- {
- LoginServer loginServer = new LoginServer(OpenSim_Main.gridServers.GridServer);
- loginServer.Startup();
- }
- assetCache = new AssetCache(OpenSim_Main.gridServers.AssetServer);
-
- sim.Startup();
- while(true) {
- Thread.Sleep(1000);
- }
- }
- private OpenSim_Main() {
- }
-
- private void Startup() {
- timer1.Enabled = true;
- timer1.Interval = 100;
- timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
-
- // We check our local database first, then the grid for config options
- Console.WriteLine("Main.cs:Startup() - Loading configuration");
- cfg = new SimConfig();
- cfg.InitConfig();
- Console.WriteLine("Main.cs:Startup() - Contacting gridserver");
- cfg.LoadFromGrid();
- Console.WriteLine("Main.cs:Startup() - We are " + cfg.RegionName + " at " + cfg.RegionLocX.ToString() + "," + cfg.RegionLocY.ToString());
- Console.WriteLine("Initialising world");
- local_world = cfg.LoadWorld();
-
- this.physManager = new PhysicsSystem.PhysicsManager();
- this.physManager.LoadPlugins();
- Console.WriteLine("Main.cs:Startup() - Starting up messaging system");
- local_world.PhysScene = this.physManager.GetPhysicsScene("PhysX"); //should be reading from the config file what physics engine to use
- MainServerListener();
- }
- private void OnReceivedData(IAsyncResult result) {
- ipeSender = new IPEndPoint(IPAddress.Any, 0);
- epSender = (EndPoint)ipeSender;
- Packet packet = null;
- int numBytes = Server.EndReceiveFrom(result, ref epSender);
- int packetEnd = numBytes - 1;
- packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
- Console.Error.WriteLine(packet.ToString());
- // This is either a new client or a packet to send to an old one
- if(ClientThreads.ContainsKey(epSender)) {
- ClientThreads[epSender].InPacket(packet);
- } else if( packet.Type == PacketType.UseCircuitCode ) { // new client
- OpenSimClient newuser = new OpenSimClient(epSender,(UseCircuitCodePacket)packet);
- ClientThreads.Add(epSender, newuser);
- } else { // invalid client
- Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
- }
- Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
- }
- private void MainServerListener() {
- Console.WriteLine("Main.cs:MainServerListener() - New thread started");
- Console.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + cfg.IPListenAddr + ":" + cfg.IPListenPort);
- ServerIncoming = new IPEndPoint(IPAddress.Any, cfg.IPListenPort);
- Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- Server.Bind(ServerIncoming);
-
- Console.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen");
- ipeSender = new IPEndPoint(IPAddress.Any, 0);
- epSender = (EndPoint) ipeSender;
- ReceivedData = new AsyncCallback(this.OnReceivedData);
- Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
-
- Console.WriteLine("Main.cs:MainServerListener() - Listening...");
-
- }
-
- void Timer1Tick( object sender, System.EventArgs e )
- {
- local_world.Update();
- }
- }
-
- public class Grid
- {
- public IAssetServer AssetServer;
- public IGridServer GridServer;
-
- public Grid(bool sandbox)
- {
- if(sandbox)
- {
- this.AssetServer =(IAssetServer) new LocalAssetServer(); //assets not implemented yet
- this.GridServer =(IGridServer) new LocalGridServer();
- }
- else
- {
- this.AssetServer =(IAssetServer) new RemoteAssetServer(); //assets not implemented yet
- this.GridServer =(IGridServer) new RemoteGridServer();
- }
- }
- }
- }
|