Removed stale client components: MXP and VWoHTTP.
							parent
							
								
									6a3a39b876
								
							
						
					
					
						commit
						7772e1e571
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,131 +0,0 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSimulator Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
| using System.Timers; | ||||
| using log4net; | ||||
| using MXP; | ||||
| using Nini.Config; | ||||
| using OpenMetaverse; | ||||
| using OpenSim.Client.MXP.PacketHandler; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Client.MXP | ||||
| { | ||||
| 
 | ||||
|     /** | ||||
|      * MXP Client Module which adds MXP support to client / region communication. | ||||
|      */ | ||||
|     public class MXPModule : IRegionModule | ||||
|     { | ||||
|         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         private MXPPacketServer m_server; | ||||
| 
 | ||||
|         private IConfigSource m_config; | ||||
|         private int m_port = 1253; | ||||
|         private Timer m_ticker; | ||||
| 
 | ||||
|         private readonly Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>(); | ||||
|         private bool m_shutdown; | ||||
| 
 | ||||
|         public void Initialise(Scene scene, IConfigSource source) | ||||
|         { | ||||
|             if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID)) | ||||
|                 m_scenes.Add(scene.RegionInfo.RegionID, scene); | ||||
| 
 | ||||
|             m_config = source; | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|             if (m_config.Configs["MXP"] != null) | ||||
|             { | ||||
|                 IConfig con = m_config.Configs["MXP"]; | ||||
| 
 | ||||
|                 if (!con.GetBoolean("Enabled", false)) | ||||
|                     return; | ||||
| 
 | ||||
|                 m_port = con.GetInt("Port", m_port); | ||||
| 
 | ||||
|                 m_server = new MXPPacketServer(m_port, m_scenes,m_config.Configs["StandAlone"].GetBoolean("accounts_authenticate",true)); | ||||
| 
 | ||||
|                 m_ticker = new Timer(100); | ||||
|                 m_ticker.AutoReset = false; | ||||
|                 m_ticker.Elapsed += ticker_Elapsed; | ||||
| 
 | ||||
|                 lock (m_ticker) | ||||
|                     m_ticker.Start(); | ||||
| 
 | ||||
|                 m_log.Info("[MXP ClientStack] MXP Enabled and Listening"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         void ticker_Elapsed(object sender, ElapsedEventArgs e) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 m_server.Process(); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 m_log.Error("[MXP ClientStack]: Unhandled exception in process loop: " + ex.ToString() + " :" + ex.StackTrace.ToString()); | ||||
|             } | ||||
| 
 | ||||
|             if (!m_shutdown) | ||||
|             { | ||||
|                 lock (m_ticker) | ||||
|                     m_ticker.Start(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Close() | ||||
|         { | ||||
|             m_shutdown = true; | ||||
|             if (m_ticker != null) | ||||
|             { | ||||
|                 lock (m_ticker) | ||||
|                     m_ticker.Stop(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public string Name | ||||
|         { | ||||
|             get { return "MXP ClientStack Module"; } | ||||
|         } | ||||
| 
 | ||||
|         public bool IsSharedModule | ||||
|         { | ||||
|             get { return true; } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
|  | @ -1,42 +0,0 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSimulator Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using OpenMetaverse; | ||||
| 
 | ||||
| namespace OpenSim.Client.MXP | ||||
| { | ||||
|     public static class MXPUtil | ||||
|     { | ||||
|         public static string GenerateMXPURL(string server, int port, UUID bubbleID, Vector3 location) | ||||
|         { | ||||
|             return string.Format("mxp://{0}:{1}/{2}/{3}", server, port, bubbleID.Guid, location); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -1,561 +0,0 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSimulator Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| /* This file borrows heavily from MXPServer.cs - the reference MXPServer  | ||||
|  * See http://www.bubblecloud.org for a copy of the original file and | ||||
|  * implementation details. */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Threading; | ||||
| using log4net; | ||||
| using MXP; | ||||
| using MXP.Messages; | ||||
| using OpenMetaverse; | ||||
| using OpenSim.Client.MXP.ClientStack; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Framework.Communications; | ||||
| using OpenSim.Services.Interfaces; | ||||
| using System.Security.Cryptography; | ||||
| 
 | ||||
| namespace OpenSim.Client.MXP.PacketHandler | ||||
| { | ||||
|     public class MXPPacketServer | ||||
|     { | ||||
|         internal static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         #region Fields | ||||
| 
 | ||||
|         private readonly List<MXPClientView> m_clients = new List<MXPClientView>(); | ||||
|         private readonly Dictionary<UUID, Scene> m_scenes; | ||||
|         private readonly Transmitter m_transmitter; | ||||
| 
 | ||||
| //        private readonly Thread m_clientThread; | ||||
| 
 | ||||
|         private readonly IList<Session> m_sessions = new List<Session>(); | ||||
|         private readonly IList<Session> m_sessionsToClient = new List<Session>(); | ||||
|         private readonly IList<MXPClientView> m_sessionsToRemove = new List<MXPClientView>(); | ||||
| 
 | ||||
|         private readonly int m_port; | ||||
| //        private readonly bool m_accountsAuthenticate; | ||||
| 
 | ||||
|         private readonly String m_programName; | ||||
|         private readonly byte m_programMajorVersion; | ||||
|         private readonly byte m_programMinorVersion; | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Constructors | ||||
| 
 | ||||
|         public MXPPacketServer(int port, Dictionary<UUID, Scene> scenes, bool accountsAuthenticate) | ||||
|         { | ||||
|             m_port = port; | ||||
| //            m_accountsAuthenticate = accountsAuthenticate; | ||||
| 
 | ||||
|             m_scenes = scenes; | ||||
| 
 | ||||
|             m_programMinorVersion = 63; | ||||
|             m_programMajorVersion = 0; | ||||
|             m_programName = "OpenSimulator"; | ||||
| 
 | ||||
|             m_transmitter = new Transmitter(port); | ||||
| 
 | ||||
|             StartListener(); | ||||
|         } | ||||
| 
 | ||||
|         public void StartListener() | ||||
|         { | ||||
|             m_log.Info("[MXP ClientStack] Transmitter starting on UDP server port: " + m_port); | ||||
|             m_transmitter.Startup(); | ||||
|             m_log.Info("[MXP ClientStack] Transmitter started. MXP version: "+MxpConstants.ProtocolMajorVersion+"."+MxpConstants.ProtocolMinorVersion+" Source Revision: "+MxpConstants.ProtocolSourceRevision); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Properties | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Number of sessions pending. (Process() accepts pending sessions). | ||||
|         /// </summary> | ||||
|         public int PendingSessionCount | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter.PendingSessionCount; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Number of connected sessions. | ||||
|         /// </summary> | ||||
|         public int SessionCount | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_sessions.Count; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Property reflecting whether client transmitter threads are alive. | ||||
|         /// </summary> | ||||
|         public bool IsTransmitterAlive | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null && m_transmitter.IsAlive; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Number of packets sent. | ||||
|         /// </summary> | ||||
|         public ulong PacketsSent | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.PacketsSent : 0; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Number of packets received. | ||||
|         /// </summary> | ||||
|         public ulong PacketsReceived | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.PacketsReceived : 0; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Bytes client has received so far. | ||||
|         /// </summary> | ||||
|         public ulong BytesReceived | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.BytesReceived : 0; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Bytes client has sent so far. | ||||
|         /// </summary> | ||||
|         public ulong BytesSent | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.BytesSent : 0; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Number of bytes received (bytes per second) during past second. | ||||
|         /// </summary> | ||||
|         public double ReceiveRate | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.ReceiveRate : 0; | ||||
|             } | ||||
|         } | ||||
|         /// <summary> | ||||
|         /// Number of bytes sent (bytes per second) during past second. | ||||
|         /// </summary> | ||||
|         public double SendRate | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return m_transmitter != null ? m_transmitter.SendRate : 0; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Session Management | ||||
| 
 | ||||
|         public void Disconnect(Session session) | ||||
|         { | ||||
|             if (session.IsConnected) | ||||
|             { | ||||
|                 Message message = MessageFactory.Current.ReserveMessage(typeof(LeaveRequestMessage)); | ||||
|                 session.Send(message); | ||||
|                 MessageFactory.Current.ReleaseMessage(message); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 throw new Exception("Not connected."); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Processing | ||||
| 
 | ||||
|         public void Process() | ||||
|         { | ||||
|             ProcessMessages(); | ||||
|             Clean(); | ||||
|         } | ||||
| 
 | ||||
|         public void Clean() | ||||
|         { | ||||
|             foreach (MXPClientView clientView in m_clients) | ||||
|             { | ||||
|                 if (clientView.Session.SessionState == SessionState.Disconnected) | ||||
|                 { | ||||
|                     m_sessionsToRemove.Add(clientView); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             foreach (MXPClientView clientView in m_sessionsToRemove) | ||||
|             { | ||||
|                 clientView.Scene.RemoveClient(clientView.AgentId); | ||||
|                 clientView.OnClean(); | ||||
|                 m_clients.Remove(clientView); | ||||
|                 m_sessions.Remove(clientView.Session); | ||||
|             } | ||||
| 
 | ||||
|             m_sessionsToRemove.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         public void ProcessMessages() | ||||
|         { | ||||
|             if (m_transmitter.PendingSessionCount > 0) | ||||
|             { | ||||
|                 Session tmp = m_transmitter.AcceptPendingSession(); | ||||
|                 m_sessions.Add(tmp); | ||||
|                 m_sessionsToClient.Add(tmp); | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             List<Session> tmpRemove = new List<Session>(); | ||||
| 
 | ||||
|             foreach (Session session in m_sessionsToClient) | ||||
|             { | ||||
|                 while (session.AvailableMessages > 0) | ||||
|                 { | ||||
|                     Message message = session.Receive(); | ||||
| 
 | ||||
|                     if (message.GetType() == typeof (JoinRequestMessage)) | ||||
|                     { | ||||
| 
 | ||||
|                         JoinRequestMessage joinRequestMessage = (JoinRequestMessage) message; | ||||
| 
 | ||||
|                         m_log.Info("[MXP ClientStack]: Session join request: " + session.SessionId + " (" + | ||||
|                            (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + | ||||
|                             session.RemoteEndPoint.Port + ")"); | ||||
| 
 | ||||
|                         try | ||||
|                         { | ||||
| 
 | ||||
|                             if (joinRequestMessage.BubbleId == Guid.Empty) | ||||
|                             { | ||||
|                                 foreach (Scene scene in m_scenes.Values) | ||||
|                                 { | ||||
|                                     if (scene.RegionInfo.RegionName == joinRequestMessage.BubbleName) | ||||
|                                     { | ||||
|                                         m_log.Info("[MXP ClientStack]: Resolved region by name: " + joinRequestMessage.BubbleName + " (" + scene.RegionInfo.RegionID + ")"); | ||||
|                                         joinRequestMessage.BubbleId = scene.RegionInfo.RegionID.Guid; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
| 
 | ||||
|                             if (joinRequestMessage.BubbleId == Guid.Empty) | ||||
|                             { | ||||
|                                 m_log.Warn("[MXP ClientStack]: Failed to resolve region by name: " + joinRequestMessage.BubbleName); | ||||
|                             } | ||||
| 
 | ||||
|                             UUID sceneId = new UUID(joinRequestMessage.BubbleId); | ||||
| 
 | ||||
|                             bool regionExists = true; | ||||
|                             if (!m_scenes.ContainsKey(sceneId)) | ||||
|                             { | ||||
|                                 m_log.Info("[MXP ClientStack]: No such region: " + sceneId); | ||||
|                                 regionExists = false; | ||||
|                             } | ||||
| 
 | ||||
|                             UUID userId = UUID.Zero; | ||||
|                             UserAccount account = null; | ||||
|                             bool authorized = regionExists ? AuthoriseUser(joinRequestMessage.ParticipantName, | ||||
|                                                             joinRequestMessage.ParticipantPassphrase, | ||||
|                                                             new UUID(joinRequestMessage.BubbleId), out account) | ||||
|                                                             : false; | ||||
| 
 | ||||
|                             if (authorized) | ||||
|                             { | ||||
|                                 Scene scene = m_scenes[sceneId]; | ||||
|                                 UUID mxpSessionID = UUID.Random(); | ||||
|                                  | ||||
|                                 string reason; | ||||
| 
 | ||||
|                                 m_log.Debug("[MXP ClientStack]: Session join request success: " + session.SessionId + " (" + | ||||
|                                    (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + | ||||
|                                    session.RemoteEndPoint.Port + ")"); | ||||
| 
 | ||||
|                                 m_log.Debug("[MXP ClientStack]: Attaching UserAgent to UserProfile..."); | ||||
|                                 UUID secureSession = UUID.Zero; | ||||
|                                 AttachUserAgentToUserProfile(account, session, mxpSessionID, sceneId, out secureSession); | ||||
|                                 m_log.Debug("[MXP ClientStack]: Attached UserAgent to UserProfile."); | ||||
|                                 m_log.Debug("[MXP ClientStack]: Preparing Scene to Connection..."); | ||||
|                                 if (!PrepareSceneForConnection(mxpSessionID, secureSession, sceneId, account, out reason)) | ||||
|                                 { | ||||
|                                     m_log.DebugFormat("[MXP ClientStack]: Scene refused connection: {0}", reason); | ||||
|                                     DeclineConnection(session, joinRequestMessage); | ||||
|                                     tmpRemove.Add(session); | ||||
|                                     continue; | ||||
|                                 } | ||||
|                                 m_log.Debug("[MXP ClientStack]: Prepared Scene to Connection."); | ||||
|                                 m_log.Debug("[MXP ClientStack]: Accepting connection..."); | ||||
|                                 AcceptConnection(session, joinRequestMessage, mxpSessionID, userId); | ||||
|                                 m_log.Info("[MXP ClientStack]: Accepted connection."); | ||||
| 
 | ||||
|                                 m_log.Debug("[MXP ClientStack]: Creating ClientView...."); | ||||
|                                 MXPClientView client = new MXPClientView(session, mxpSessionID, userId, scene, account.FirstName, account.LastName); | ||||
|                                 m_clients.Add(client); | ||||
|                                 m_log.Debug("[MXP ClientStack]: Created ClientView."); | ||||
| 
 | ||||
|                                 client.MXPSendSynchronizationBegin(m_scenes[new UUID(joinRequestMessage.BubbleId)].SceneContents.GetTotalObjectsCount()); | ||||
| 
 | ||||
|                                 m_log.Debug("[MXP ClientStack]: Starting ClientView..."); | ||||
|                                 try | ||||
|                                 { | ||||
|                                     client.Start(); | ||||
|                                     m_log.Debug("[MXP ClientStack]: Started ClientView."); | ||||
|                                 } | ||||
|                                 catch (Exception e) | ||||
|                                 { | ||||
|                                     m_log.Error(e); | ||||
|                                 } | ||||
| 
 | ||||
|                                 m_log.Debug("[MXP ClientStack]: Connected"); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 m_log.Info("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" + | ||||
|                                            (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + | ||||
|                                            session.RemoteEndPoint.Port + ")"); | ||||
| 
 | ||||
|                                 DeclineConnection(session, joinRequestMessage); | ||||
|                             } | ||||
|                         } | ||||
|                         catch (Exception e) | ||||
|                         { | ||||
|                             m_log.Error("[MXP ClientStack]: Session join request failure: " + session.SessionId + " (" + | ||||
|                                (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + | ||||
|                                session.RemoteEndPoint.Port + "): "+e.ToString()+" :"+e.StackTrace.ToString()); | ||||
|                         } | ||||
|                         tmpRemove.Add(session); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             foreach (Session session in tmpRemove) | ||||
|             { | ||||
|                 m_sessionsToClient.Remove(session); | ||||
|             } | ||||
| 
 | ||||
|             foreach (MXPClientView clientView in m_clients) | ||||
|             { | ||||
|                 int messagesProcessedCount = 0; | ||||
|                 Session session = clientView.Session; | ||||
| 
 | ||||
|                 while (session.AvailableMessages > 0) | ||||
|                 { | ||||
|                     Message message = session.Receive(); | ||||
| 
 | ||||
|                     if (message.GetType() == typeof(LeaveRequestMessage)) | ||||
|                     { | ||||
|                         LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)MessageFactory.Current.ReserveMessage( | ||||
|                             typeof(LeaveResponseMessage)); | ||||
| 
 | ||||
|                         m_log.Debug("[MXP ClientStack]: Session leave request: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")"); | ||||
| 
 | ||||
|                         leaveResponseMessage.RequestMessageId = message.MessageId; | ||||
|                         leaveResponseMessage.FailureCode = 0; | ||||
|                         session.Send(leaveResponseMessage); | ||||
| 
 | ||||
|                         if (session.SessionState != SessionState.Disconnected) | ||||
|                         { | ||||
|                             session.SetStateDisconnected(); | ||||
|                         } | ||||
| 
 | ||||
|                         m_log.Debug("[MXP ClientStack]: Removing Client from Scene"); | ||||
|                         //clientView.Scene.RemoveClient(clientView.AgentId); | ||||
|                     } | ||||
|                     if (message.GetType() == typeof(LeaveResponseMessage)) | ||||
|                     { | ||||
|                         LeaveResponseMessage leaveResponseMessage = (LeaveResponseMessage)message; | ||||
| 
 | ||||
|                         m_log.Debug("[MXP ClientStack]: Session leave response: " + session.SessionId + " (" + (session.IsIncoming ? "from" : "to") + " " + session.RemoteEndPoint.Address + ":" + session.RemoteEndPoint.Port + ")"); | ||||
| 
 | ||||
|                         if (leaveResponseMessage.FailureCode == 0) | ||||
|                         { | ||||
|                             session.SetStateDisconnected(); | ||||
|                         } | ||||
| 
 | ||||
|                         m_log.Debug("[MXP ClientStack]: Removing Client from Scene"); | ||||
|                         //clientView.Scene.RemoveClient(clientView.AgentId); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         clientView.MXPPRocessMessage(message); | ||||
|                     } | ||||
| 
 | ||||
|                     MessageFactory.Current.ReleaseMessage(message); | ||||
|                     messagesProcessedCount++; | ||||
|                     if (messagesProcessedCount > 1000) | ||||
|                     { | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void AcceptConnection(Session session, JoinRequestMessage joinRequestMessage, UUID mxpSessionID, UUID userId) | ||||
|         { | ||||
|             JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage( | ||||
|                                                                                typeof(JoinResponseMessage)); | ||||
| 
 | ||||
|             joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId; | ||||
|             joinResponseMessage.FailureCode = MxpResponseCodes.SUCCESS; | ||||
|              | ||||
|             joinResponseMessage.BubbleId = joinRequestMessage.BubbleId; | ||||
|             joinResponseMessage.ParticipantId = userId.Guid; | ||||
|             joinResponseMessage.AvatarId = userId.Guid; | ||||
|             joinResponseMessage.BubbleAssetCacheUrl = "http://" + | ||||
|                                                       NetworkUtil.GetHostFor(session.RemoteEndPoint.Address, | ||||
|                                                                              m_scenes[ | ||||
|                                                                                  new UUID(joinRequestMessage.BubbleId)]. | ||||
|                                                                                  RegionInfo. | ||||
|                                                                                  ExternalHostName) + ":" + | ||||
|                                                       m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo. | ||||
|                                                           HttpPort + "/assets/"; | ||||
| 
 | ||||
|             joinResponseMessage.BubbleName = m_scenes[new UUID(joinRequestMessage.BubbleId)].RegionInfo.RegionName; | ||||
| 
 | ||||
|             joinResponseMessage.BubbleRange = 128; | ||||
|             joinResponseMessage.BubblePerceptionRange = 128 + 256; | ||||
|             joinResponseMessage.BubbleRealTime = 0; | ||||
|             joinResponseMessage.ProgramName = m_programName; | ||||
|             joinResponseMessage.ProgramMajorVersion = m_programMajorVersion; | ||||
|             joinResponseMessage.ProgramMinorVersion = m_programMinorVersion; | ||||
|             joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion; | ||||
|             joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion; | ||||
|             joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision; | ||||
| 
 | ||||
|             session.Send(joinResponseMessage); | ||||
| 
 | ||||
|             session.SetStateConnected(); | ||||
|         } | ||||
| 
 | ||||
|         private void DeclineConnection(Session session, Message joinRequestMessage) | ||||
|         { | ||||
|             JoinResponseMessage joinResponseMessage = (JoinResponseMessage)MessageFactory.Current.ReserveMessage(typeof(JoinResponseMessage)); | ||||
| 
 | ||||
|             joinResponseMessage.RequestMessageId = joinRequestMessage.MessageId; | ||||
|             joinResponseMessage.FailureCode = MxpResponseCodes.UNAUTHORIZED_OPERATION; | ||||
| 
 | ||||
|             joinResponseMessage.ProgramName = m_programName; | ||||
|             joinResponseMessage.ProgramMajorVersion = m_programMajorVersion; | ||||
|             joinResponseMessage.ProgramMinorVersion = m_programMinorVersion; | ||||
|             joinResponseMessage.ProtocolMajorVersion = MxpConstants.ProtocolMajorVersion; | ||||
|             joinResponseMessage.ProtocolMinorVersion = MxpConstants.ProtocolMinorVersion; | ||||
|             joinResponseMessage.ProtocolSourceRevision = MxpConstants.ProtocolSourceRevision; | ||||
| 
 | ||||
|             session.Send(joinResponseMessage); | ||||
| 
 | ||||
|             session.SetStateDisconnected(); | ||||
|         } | ||||
| 
 | ||||
|         public bool AuthoriseUser(string participantName, string password, UUID sceneId, out UserAccount account) | ||||
|         { | ||||
|             string firstName = ""; | ||||
|             string lastName = ""; | ||||
|             account = null; | ||||
| 
 | ||||
|             string[] nameParts = participantName.Split(' '); | ||||
|             if (nameParts.Length != 2) | ||||
|             { | ||||
|                 m_log.Error("[MXP ClientStack]: Login failed as user name is not formed of first and last name separated by space: " + participantName); | ||||
|                 return false; | ||||
|             } | ||||
|             firstName = nameParts[0]; | ||||
|             lastName = nameParts[1]; | ||||
| 
 | ||||
|             account = m_scenes[sceneId].UserAccountService.GetUserAccount(m_scenes[sceneId].RegionInfo.ScopeID, firstName, lastName); | ||||
|             if (account != null) | ||||
|                 return (m_scenes[sceneId].AuthenticationService.Authenticate(account.PrincipalID, password, 1) != string.Empty); | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         private void AttachUserAgentToUserProfile(UserAccount account, Session session, UUID sessionId, UUID sceneId, out UUID secureSessionId) | ||||
|         { | ||||
|             secureSessionId = UUID.Random(); | ||||
|             Scene scene = m_scenes[sceneId]; | ||||
|             scene.PresenceService.LoginAgent(account.PrincipalID.ToString(), sessionId, secureSessionId); | ||||
|         } | ||||
| 
 | ||||
|         private bool PrepareSceneForConnection(UUID sessionId, UUID secureSessionId, UUID sceneId, UserAccount account, out string reason) | ||||
|         { | ||||
|             Scene scene = m_scenes[sceneId]; | ||||
| 
 | ||||
|             AgentCircuitData agent = new AgentCircuitData(); | ||||
|             agent.AgentID = account.PrincipalID; | ||||
|             agent.firstname = account.FirstName; | ||||
|             agent.lastname = account.LastName; | ||||
|             agent.SessionID = sessionId; | ||||
|             agent.SecureSessionID = secureSessionId; | ||||
|             agent.circuitcode = sessionId.CRC(); | ||||
|             agent.BaseFolder = UUID.Zero; | ||||
|             agent.InventoryFolder = UUID.Zero; | ||||
|             agent.startpos = new Vector3(0, 0, 0); // TODO Fill in region start position | ||||
|             agent.CapsPath = "http://localhost/"; | ||||
|             agent.Appearance = scene.AvatarService.GetAppearance(account.PrincipalID); | ||||
| 
 | ||||
|             if (agent.Appearance == null) | ||||
|             { | ||||
|                 m_log.WarnFormat("[INTER]: Appearance not found for {0} {1}. Creating default.", agent.firstname, agent.lastname); | ||||
|                 agent.Appearance = new AvatarAppearance(); | ||||
|             } | ||||
|              | ||||
|             return scene.NewUserConnection(agent, 0, out reason); | ||||
|         } | ||||
| 
 | ||||
|         public void PrintDebugInformation() | ||||
|         { | ||||
|             m_log.Info("[MXP ClientStack]: Statistics report"); | ||||
|             m_log.Info("Pending Sessions: " + PendingSessionCount); | ||||
|             m_log.Info("Sessions: " + SessionCount + " (Clients: " + m_clients.Count + " )"); | ||||
|             m_log.Info("Transmitter Alive?: " + IsTransmitterAlive); | ||||
|             m_log.Info("Packets Sent/Received: " + PacketsSent + " / " + PacketsReceived); | ||||
|             m_log.Info("Bytes Sent/Received: " + BytesSent + " / " + BytesReceived); | ||||
|             m_log.Info("Send/Receive Rate (bps): " + SendRate + " / " + ReceiveRate); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|      | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,133 +0,0 @@ | |||
| /* | ||||
|  * Copyright (c) Contributors, http://opensimulator.org/ | ||||
|  * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer in the | ||||
|  *       documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of the OpenSimulator Project nor the | ||||
|  *       names of its contributors may be used to endorse or promote products | ||||
|  *       derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using Nini.Config; | ||||
| using OpenMetaverse; | ||||
| using OpenSim.Client.VWoHTTP.ClientStack; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Servers; | ||||
| using OpenSim.Framework.Servers.HttpServer; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Client.VWoHTTP | ||||
| { | ||||
|     class VWoHTTPModule : IRegionModule, IHttpAgentHandler | ||||
|     { | ||||
|         private bool m_disabled = true; | ||||
| 
 | ||||
|         private IHttpServer m_httpd; | ||||
| 
 | ||||
|         private readonly List<Scene> m_scenes = new List<Scene>(); | ||||
| 
 | ||||
|         private Dictionary<UUID, VWHClientView> m_clients = new Dictionary<UUID, VWHClientView>(); | ||||
| 
 | ||||
|         #region Implementation of IRegionModule | ||||
| 
 | ||||
|         public void Initialise(Scene scene, IConfigSource source) | ||||
|         { | ||||
|             if (m_disabled) | ||||
|                 return; | ||||
| 
 | ||||
|             m_scenes.Add(scene); | ||||
| 
 | ||||
|             m_httpd = MainServer.Instance; | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|             if (m_disabled) | ||||
|                 return; | ||||
| 
 | ||||
|             m_httpd.AddAgentHandler("vwohttp", this); | ||||
|         } | ||||
| 
 | ||||
|         public void Close() | ||||
|         { | ||||
|             if (m_disabled) | ||||
|                 return; | ||||
| 
 | ||||
|             m_httpd.RemoveAgentHandler("vwohttp", this); | ||||
|         } | ||||
| 
 | ||||
|         public string Name | ||||
|         { | ||||
|             get { return "VWoHTTP ClientStack"; } | ||||
|         } | ||||
| 
 | ||||
|         public bool IsSharedModule | ||||
|         { | ||||
|             get { return true; } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Implementation of IHttpAgentHandler | ||||
| 
 | ||||
|         public bool Handle(OSHttpRequest req, OSHttpResponse resp) | ||||
|         { | ||||
|             string[] urlparts = req.Url.AbsolutePath.Split(new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries); | ||||
| 
 | ||||
|             if (urlparts.Length < 2) | ||||
|                 return false; | ||||
| 
 | ||||
|             if (urlparts[1] == "connect") | ||||
|             { | ||||
|                 UUID sessID = UUID.Random(); | ||||
| 
 | ||||
|                 VWHClientView client = new VWHClientView(sessID, UUID.Random(), "VWoHTTPClient", m_scenes[0]); | ||||
| 
 | ||||
|                 m_clients.Add(sessID, client); | ||||
| 
 | ||||
|                 return true; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (urlparts.Length < 3) | ||||
|                     return false; | ||||
| 
 | ||||
|                 UUID sessionID; | ||||
|                 if (!UUID.TryParse(urlparts[1], out sessionID)) | ||||
|                     return false; | ||||
| 
 | ||||
|                 if (!m_clients.ContainsKey(sessionID)) | ||||
|                     return false; | ||||
| 
 | ||||
|                 return m_clients[sessionID].ProcessInMsg(req, resp); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public bool Match(OSHttpRequest req, OSHttpResponse resp) | ||||
|         { | ||||
|             return req.Url.ToString().Contains("vwohttp"); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								bin/MXP.dll
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								bin/MXP.dll
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										63
									
								
								prebuild.xml
								
								
								
								
							
							
						
						
									
										63
									
								
								prebuild.xml
								
								
								
								
							|  | @ -1959,69 +1959,6 @@ | |||
|       </Files> | ||||
|     </Project> | ||||
| 
 | ||||
|     <!-- Client Stack Modules --> | ||||
| 
 | ||||
|     <Project frameworkVersion="v3_5" name="OpenSim.Client.MXP" path="OpenSim/Client/MXP" type="Library"> | ||||
|       <Configuration name="Debug"> | ||||
|         <Options> | ||||
|           <OutputPath>../../../bin/</OutputPath> | ||||
|         </Options> | ||||
|       </Configuration> | ||||
|       <Configuration name="Release"> | ||||
|         <Options> | ||||
|           <OutputPath>../../../bin/</OutputPath> | ||||
|         </Options> | ||||
|       </Configuration> | ||||
| 
 | ||||
|       <ReferencePath>../../../bin/</ReferencePath> | ||||
| 
 | ||||
|       <Reference name="OpenMetaverseTypes" path="../../../bin/"/> | ||||
|       <Reference name="OpenMetaverse" path="../../../bin/"/> | ||||
|       <Reference name="System"/> | ||||
|       <Reference name="OpenSim.Framework"/> | ||||
|       <Reference name="OpenSim.Region.Framework"/> | ||||
|       <Reference name="OpenSim.Framework.Communications"/> | ||||
|       <Reference name="OpenSim.Services.Interfaces"/> | ||||
|       <Reference name="Nini" path="../../../bin/"/> | ||||
|       <Reference name="log4net" path="../../../bin/"/> | ||||
|       <Reference name="protobuf-net"/> | ||||
|       <Reference name="MXP" path="../../../bin/"/> | ||||
|       <Reference name="Mono.Addins"/> | ||||
|       <Files> | ||||
|         <Match pattern="*.cs" recurse="true"/> | ||||
|       </Files> | ||||
|     </Project> | ||||
| 
 | ||||
|     <Project frameworkVersion="v3_5" name="OpenSim.Client.VWoHTTP" path="OpenSim/Client/VWoHTTP" type="Library"> | ||||
|       <Configuration name="Debug"> | ||||
|         <Options> | ||||
|           <OutputPath>../../../bin/</OutputPath> | ||||
|         </Options> | ||||
|       </Configuration> | ||||
|       <Configuration name="Release"> | ||||
|         <Options> | ||||
|           <OutputPath>../../../bin/</OutputPath> | ||||
|         </Options> | ||||
|       </Configuration> | ||||
| 
 | ||||
|       <ReferencePath>../../../bin/</ReferencePath> | ||||
| 
 | ||||
|       <Reference name="OpenMetaverseTypes" path="../../../bin/"/> | ||||
|       <Reference name="OpenMetaverse" path="../../../bin/"/> | ||||
|       <Reference name="System"/> | ||||
| 	  <Reference name="System.Drawing"/> | ||||
|       <Reference name="OpenSim.Framework"/> | ||||
| 	  <Reference name="OpenSim.Framework.Servers"/> | ||||
| 	  <Reference name="OpenSim.Framework.Servers.HttpServer"/> | ||||
|       <Reference name="OpenSim.Region.Framework"/> | ||||
|       <Reference name="OpenSim.Framework.Communications"/> | ||||
|       <Reference name="OpenSim.Services.Interfaces"/> | ||||
|       <Reference name="Nini" path="../../../bin/"/> | ||||
|       <Reference name="log4net" path="../../../bin/"/> | ||||
|       <Files> | ||||
|         <Match pattern="*.cs" recurse="true"/> | ||||
|       </Files> | ||||
|     </Project> | ||||
| 
 | ||||
|     <!-- Data Base Modules --> | ||||
|     <Project frameworkVersion="v3_5" name="OpenSim.Data.MySQL" path="OpenSim/Data/MySQL" type="Library"> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Diva Canto
						Diva Canto