diff --git a/OpenSim/Framework/General/Util.cs b/OpenSim/Framework/General/Util.cs index f3a8c73488..5eae206930 100644 --- a/OpenSim/Framework/General/Util.cs +++ b/OpenSim/Framework/General/Util.cs @@ -26,6 +26,7 @@ * */ using System; +using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using System.Net; @@ -41,6 +42,7 @@ namespace OpenSim.Framework.Utilities private static Random randomClass = new Random(); private static uint nextXferID = 5000; private static object XferLock = new object(); + private static Dictionary capsURLS = new Dictionary(); public static ulong UIntsToLong(uint X, uint Y) { @@ -66,6 +68,11 @@ namespace OpenSim.Framework.Utilities return id; } + public Util() + { + + } + public static string GetFileName(string file) { // Return just the filename on UNIX platforms @@ -311,9 +318,25 @@ namespace OpenSim.Framework.Utilities return temp; } - public Util() + public static string GetCapsURL(LLUUID userID) { + if (capsURLS.ContainsKey(userID)) + { + return capsURLS[userID]; + } + return ""; + } + public static void SetCapsURL(LLUUID userID, string url) + { + if (capsURLS.ContainsKey(userID)) + { + capsURLS[userID] = url; + } + else + { + capsURLS.Add(userID, url); + } } // Nini (config) related Methods diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index c514b961d8..4eb776ee53 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -47,6 +47,11 @@ namespace OpenSim.Framework.Servers protected int m_port; protected bool m_firstcaps = true; + public int Port + { + get { return m_port; } + } + public BaseHttpServer(int port) { m_port = port; diff --git a/OpenSim/Framework/UserManager/UserManagerBase.cs b/OpenSim/Framework/UserManager/UserManagerBase.cs index c1084e958d..39681d5281 100644 --- a/OpenSim/Framework/UserManager/UserManagerBase.cs +++ b/OpenSim/Framework/UserManager/UserManagerBase.cs @@ -369,124 +369,6 @@ namespace OpenSim.Framework.UserManagement } } - // Rest and XML-RPC methods. (could move them to a sub class in the user server?) - - /// - /// Deletes an active agent session - /// - /// The request - /// The path (eg /bork/narf/test) - /// Parameters sent - /// Success "OK" else error - public string RestDeleteUserSessionMethod(string request, string path, string param) - { - // TODO! Important! - - return "OK"; - } - - /// - /// Returns an error message that the user could not be found in the database - /// - /// XML string consisting of a error element containing individual error(s) - public XmlRpcResponse CreateUnknownUserErrorResponse() - { - XmlRpcResponse response = new XmlRpcResponse(); - Hashtable responseData = new Hashtable(); - responseData["error_type"] = "unknown_user"; - responseData["error_desc"] = "The user requested is not in the database"; - - response.Value = responseData; - return response; - } - - /// - /// Converts a user profile to an XML element which can be returned - /// - /// The user profile - /// A string containing an XML Document of the user profile - public XmlRpcResponse ProfileToXmlRPCResponse(UserProfileData profile) - { - XmlRpcResponse response = new XmlRpcResponse(); - Hashtable responseData = new Hashtable(); - - // Account information - responseData["firstname"] = profile.username; - responseData["lastname"] = profile.surname; - responseData["uuid"] = profile.UUID.ToStringHyphenated(); - // Server Information - responseData["server_inventory"] = profile.userInventoryURI; - responseData["server_asset"] = profile.userAssetURI; - // Profile Information - responseData["profile_about"] = profile.profileAboutText; - responseData["profile_firstlife_about"] = profile.profileFirstText; - responseData["profile_firstlife_image"] = profile.profileFirstImage.ToStringHyphenated(); - responseData["profile_can_do"] = profile.profileCanDoMask.ToString(); - responseData["profile_want_do"] = profile.profileWantDoMask.ToString(); - responseData["profile_image"] = profile.profileImage.ToStringHyphenated(); - responseData["profile_created"] = profile.created.ToString(); - responseData["profile_lastlogin"] = profile.lastLogin.ToString(); - // Home region information - responseData["home_coordinates_x"] = profile.homeLocation.X.ToString(); - responseData["home_coordinates_y"] = profile.homeLocation.Y.ToString(); - responseData["home_coordinates_z"] = profile.homeLocation.Z.ToString(); - - responseData["home_region"] = profile.homeRegion.ToString(); - - responseData["home_look_x"] = profile.homeLookAt.X.ToString(); - responseData["home_look_y"] = profile.homeLookAt.Y.ToString(); - responseData["home_look_z"] = profile.homeLookAt.Z.ToString(); - response.Value = responseData; - - return response; - } - - #region XMLRPC User Methods - //should most likely move out of here and into the grid's userserver sub class - public XmlRpcResponse XmlRPCGetUserMethodName(XmlRpcRequest request) - { - XmlRpcResponse response = new XmlRpcResponse(); - Hashtable requestData = (Hashtable)request.Params[0]; - UserProfileData userProfile; - if (requestData.Contains("avatar_name")) - { - userProfile = getUserProfile((string)requestData["avatar_name"]); - if (userProfile == null) - { - return CreateUnknownUserErrorResponse(); - } - } - else - { - return CreateUnknownUserErrorResponse(); - } - - return ProfileToXmlRPCResponse(userProfile); - } - - public XmlRpcResponse XmlRPCGetUserMethodUUID(XmlRpcRequest request) - { - XmlRpcResponse response = new XmlRpcResponse(); - Hashtable requestData = (Hashtable)request.Params[0]; - UserProfileData userProfile; - System.Console.WriteLine("METHOD BY UUID CALLED"); - if (requestData.Contains("avatar_uuid")) - { - userProfile = getUserProfile((LLUUID)(string)requestData["avatar_uuid"]); - if (userProfile == null) - { - return CreateUnknownUserErrorResponse(); - } - } - else - { - return CreateUnknownUserErrorResponse(); - } - - - return ProfileToXmlRPCResponse(userProfile); - } - #endregion - + // Rest and XML-RPC methods. (have moved them to a sub class in the user server) } } diff --git a/OpenSim/Grid/UserServer/UserManager.cs b/OpenSim/Grid/UserServer/UserManager.cs index 4203ba631f..c68b260a52 100644 --- a/OpenSim/Grid/UserServer/UserManager.cs +++ b/OpenSim/Grid/UserServer/UserManager.cs @@ -32,6 +32,7 @@ using Nwc.XmlRpc; using OpenSim.Framework.Data; using OpenSim.Framework.UserManagement; using OpenSim.Framework.Utilities; +using libsecondlife; namespace OpenSim.Grid.UserServer { @@ -41,6 +42,122 @@ namespace OpenSim.Grid.UserServer { } - + + /// + /// Deletes an active agent session + /// + /// The request + /// The path (eg /bork/narf/test) + /// Parameters sent + /// Success "OK" else error + public string RestDeleteUserSessionMethod(string request, string path, string param) + { + // TODO! Important! + + return "OK"; + } + + /// + /// Returns an error message that the user could not be found in the database + /// + /// XML string consisting of a error element containing individual error(s) + public XmlRpcResponse CreateUnknownUserErrorResponse() + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + responseData["error_type"] = "unknown_user"; + responseData["error_desc"] = "The user requested is not in the database"; + + response.Value = responseData; + return response; + } + + /// + /// Converts a user profile to an XML element which can be returned + /// + /// The user profile + /// A string containing an XML Document of the user profile + public XmlRpcResponse ProfileToXmlRPCResponse(UserProfileData profile) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable responseData = new Hashtable(); + + // Account information + responseData["firstname"] = profile.username; + responseData["lastname"] = profile.surname; + responseData["uuid"] = profile.UUID.ToStringHyphenated(); + // Server Information + responseData["server_inventory"] = profile.userInventoryURI; + responseData["server_asset"] = profile.userAssetURI; + // Profile Information + responseData["profile_about"] = profile.profileAboutText; + responseData["profile_firstlife_about"] = profile.profileFirstText; + responseData["profile_firstlife_image"] = profile.profileFirstImage.ToStringHyphenated(); + responseData["profile_can_do"] = profile.profileCanDoMask.ToString(); + responseData["profile_want_do"] = profile.profileWantDoMask.ToString(); + responseData["profile_image"] = profile.profileImage.ToStringHyphenated(); + responseData["profile_created"] = profile.created.ToString(); + responseData["profile_lastlogin"] = profile.lastLogin.ToString(); + // Home region information + responseData["home_coordinates_x"] = profile.homeLocation.X.ToString(); + responseData["home_coordinates_y"] = profile.homeLocation.Y.ToString(); + responseData["home_coordinates_z"] = profile.homeLocation.Z.ToString(); + + responseData["home_region"] = profile.homeRegion.ToString(); + + responseData["home_look_x"] = profile.homeLookAt.X.ToString(); + responseData["home_look_y"] = profile.homeLookAt.Y.ToString(); + responseData["home_look_z"] = profile.homeLookAt.Z.ToString(); + response.Value = responseData; + + return response; + } + + #region XMLRPC User Methods + //should most likely move out of here and into the grid's userserver sub class + public XmlRpcResponse XmlRPCGetUserMethodName(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + UserProfileData userProfile; + if (requestData.Contains("avatar_name")) + { + userProfile = getUserProfile((string)requestData["avatar_name"]); + if (userProfile == null) + { + return CreateUnknownUserErrorResponse(); + } + } + else + { + return CreateUnknownUserErrorResponse(); + } + + return ProfileToXmlRPCResponse(userProfile); + } + + public XmlRpcResponse XmlRPCGetUserMethodUUID(XmlRpcRequest request) + { + XmlRpcResponse response = new XmlRpcResponse(); + Hashtable requestData = (Hashtable)request.Params[0]; + UserProfileData userProfile; + System.Console.WriteLine("METHOD BY UUID CALLED"); + if (requestData.Contains("avatar_uuid")) + { + userProfile = getUserProfile((LLUUID)(string)requestData["avatar_uuid"]); + if (userProfile == null) + { + return CreateUnknownUserErrorResponse(); + } + } + else + { + return CreateUnknownUserErrorResponse(); + } + + + return ProfileToXmlRPCResponse(userProfile); + } + #endregion } } diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs index 661fbbe21d..88377bc99d 100644 --- a/OpenSim/Region/Communications/Local/LocalLoginService.cs +++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs @@ -89,7 +89,6 @@ namespace OpenSim.Region.Communications.Local response.RegionX = reg.RegionLocX; response.RegionY = reg.RegionLocY; - //following port needs changing as we don't want a http listener for every region (or do we?) response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/"; theUser.currentAgent.currentRegion = reg.SimUUID; theUser.currentAgent.currentHandle = reg.RegionHandle; diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 0fa3ab7e86..3ee1f19495 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -36,6 +36,7 @@ using OpenSim.Framework.Console; using OpenSim.Framework.Interfaces; using OpenSim.Framework.Servers; using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; using OpenSim.Physics.Manager; using OpenSim.Framework.Communications.Caches; using OpenSim.Region.Environment.LandManagement; @@ -836,6 +837,7 @@ namespace OpenSim.Region.Environment.Scenes Caps cap = new Caps(assetCache, httpListener, m_regInfo.ExternalHostName, m_regInfo.ExternalEndPoint.Port, agent.CapsPath, agent.AgentID); + Util.SetCapsURL(agent.AgentID, "http://" + m_regInfo.ExternalHostName + ":" + httpListener.Port.ToString() + "/CAPS/" + agent.CapsPath + "0000/"); cap.RegisterHandlers(); cap.AddNewInventoryItem = this.AddInventoryItem; cap.ItemUpdatedCall = this.UpdateInventoryItemAsset; @@ -948,7 +950,7 @@ namespace OpenSim.Region.Environment.Scenes //TODO: following line is hard coded to port 9000, really need to change this as soon as possible AgentCircuitData circuitdata = remoteClient.RequestClientInfo(); - string capsPath = "http://" + reg.ExternalEndPoint.Address.ToString() + ":9000/CAPS/" + this.AuthenticateHandler.AgentCircuits[circuitdata.circuitcode].CapsPath + "0000/"; + string capsPath = Util.GetCapsURL(remoteClient.AgentId); remoteClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), capsPath); } } @@ -1111,7 +1113,7 @@ namespace OpenSim.Region.Environment.Scenes item.assetID = asset.FullID; userInfo.updateItem(remoteClient.AgentId, item); - remoteClient.SendInventoryItemUpdate(item); + // remoteClient.SendInventoryItemUpdate(item); return (asset.FullID); } diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 1be1e7a556..6e4fcdaaf8 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -34,6 +34,7 @@ using libsecondlife.Packets; using OpenSim.Framework.Console; using OpenSim.Framework.Interfaces; using OpenSim.Framework.Types; +using OpenSim.Framework.Utilities; using OpenSim.Physics.Manager; namespace OpenSim.Region.Environment.Scenes @@ -623,7 +624,7 @@ namespace OpenSim.Region.Environment.Scenes { //TODO: following line is hard coded to port 9000, really need to change this as soon as possible AgentCircuitData circuitdata = this.ControllingClient.RequestClientInfo(); - string capsPath = "http://" + neighbourRegion.ExternalEndPoint.Address.ToString() + ":9000/CAPS/" +this.m_scene.AuthenticateHandler.AgentCircuits[circuitdata.circuitcode].CapsPath + "0000/"; + string capsPath = Util.GetCapsURL(this.ControllingClient.AgentId); this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, capsPath); this.MakeChildAgent(); }