Temporary fix for the region crossing crash, Although we need to start to change and improve how we handle caps.
parent
5699bb2e64
commit
217d511077
|
@ -26,6 +26,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
@ -41,6 +42,7 @@ namespace OpenSim.Framework.Utilities
|
||||||
private static Random randomClass = new Random();
|
private static Random randomClass = new Random();
|
||||||
private static uint nextXferID = 5000;
|
private static uint nextXferID = 5000;
|
||||||
private static object XferLock = new object();
|
private static object XferLock = new object();
|
||||||
|
private static Dictionary<LLUUID, string> capsURLS = new Dictionary<LLUUID, string>();
|
||||||
|
|
||||||
public static ulong UIntsToLong(uint X, uint Y)
|
public static ulong UIntsToLong(uint X, uint Y)
|
||||||
{
|
{
|
||||||
|
@ -66,6 +68,11 @@ namespace OpenSim.Framework.Utilities
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Util()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetFileName(string file)
|
public static string GetFileName(string file)
|
||||||
{
|
{
|
||||||
// Return just the filename on UNIX platforms
|
// Return just the filename on UNIX platforms
|
||||||
|
@ -311,9 +318,25 @@ namespace OpenSim.Framework.Utilities
|
||||||
return temp;
|
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
|
// Nini (config) related Methods
|
||||||
|
|
|
@ -47,6 +47,11 @@ namespace OpenSim.Framework.Servers
|
||||||
protected int m_port;
|
protected int m_port;
|
||||||
protected bool m_firstcaps = true;
|
protected bool m_firstcaps = true;
|
||||||
|
|
||||||
|
public int Port
|
||||||
|
{
|
||||||
|
get { return m_port; }
|
||||||
|
}
|
||||||
|
|
||||||
public BaseHttpServer(int port)
|
public BaseHttpServer(int port)
|
||||||
{
|
{
|
||||||
m_port = port;
|
m_port = port;
|
||||||
|
|
|
@ -369,124 +369,6 @@ namespace OpenSim.Framework.UserManagement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rest and XML-RPC methods. (could move them to a sub class in the user server?)
|
// Rest and XML-RPC methods. (have moved them to a sub class in the user server)
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Deletes an active agent session
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request">The request</param>
|
|
||||||
/// <param name="path">The path (eg /bork/narf/test)</param>
|
|
||||||
/// <param name="param">Parameters sent</param>
|
|
||||||
/// <returns>Success "OK" else error</returns>
|
|
||||||
public string RestDeleteUserSessionMethod(string request, string path, string param)
|
|
||||||
{
|
|
||||||
// TODO! Important!
|
|
||||||
|
|
||||||
return "OK";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns an error message that the user could not be found in the database
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>XML string consisting of a error element containing individual error(s)</returns>
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts a user profile to an XML element which can be returned
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="profile">The user profile</param>
|
|
||||||
/// <returns>A string containing an XML Document of the user profile</returns>
|
|
||||||
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
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ using Nwc.XmlRpc;
|
||||||
using OpenSim.Framework.Data;
|
using OpenSim.Framework.Data;
|
||||||
using OpenSim.Framework.UserManagement;
|
using OpenSim.Framework.UserManagement;
|
||||||
using OpenSim.Framework.Utilities;
|
using OpenSim.Framework.Utilities;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
namespace OpenSim.Grid.UserServer
|
namespace OpenSim.Grid.UserServer
|
||||||
{
|
{
|
||||||
|
@ -42,5 +43,121 @@ namespace OpenSim.Grid.UserServer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Deletes an active agent session
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request">The request</param>
|
||||||
|
/// <param name="path">The path (eg /bork/narf/test)</param>
|
||||||
|
/// <param name="param">Parameters sent</param>
|
||||||
|
/// <returns>Success "OK" else error</returns>
|
||||||
|
public string RestDeleteUserSessionMethod(string request, string path, string param)
|
||||||
|
{
|
||||||
|
// TODO! Important!
|
||||||
|
|
||||||
|
return "OK";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns an error message that the user could not be found in the database
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>XML string consisting of a error element containing individual error(s)</returns>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a user profile to an XML element which can be returned
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="profile">The user profile</param>
|
||||||
|
/// <returns>A string containing an XML Document of the user profile</returns>
|
||||||
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,6 @@ namespace OpenSim.Region.Communications.Local
|
||||||
response.RegionX = reg.RegionLocX;
|
response.RegionX = reg.RegionLocX;
|
||||||
response.RegionY = reg.RegionLocY;
|
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/";
|
response.SeedCapability = "http://" + reg.ExternalHostName + ":" + this.serversInfo.HttpListenerPort.ToString() + "/CAPS/" + capsPath + "0000/";
|
||||||
theUser.currentAgent.currentRegion = reg.SimUUID;
|
theUser.currentAgent.currentRegion = reg.SimUUID;
|
||||||
theUser.currentAgent.currentHandle = reg.RegionHandle;
|
theUser.currentAgent.currentHandle = reg.RegionHandle;
|
||||||
|
|
|
@ -36,6 +36,7 @@ using OpenSim.Framework.Console;
|
||||||
using OpenSim.Framework.Interfaces;
|
using OpenSim.Framework.Interfaces;
|
||||||
using OpenSim.Framework.Servers;
|
using OpenSim.Framework.Servers;
|
||||||
using OpenSim.Framework.Types;
|
using OpenSim.Framework.Types;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
using OpenSim.Physics.Manager;
|
using OpenSim.Physics.Manager;
|
||||||
using OpenSim.Framework.Communications.Caches;
|
using OpenSim.Framework.Communications.Caches;
|
||||||
using OpenSim.Region.Environment.LandManagement;
|
using OpenSim.Region.Environment.LandManagement;
|
||||||
|
@ -836,6 +837,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
Caps cap =
|
Caps cap =
|
||||||
new Caps(assetCache, httpListener, m_regInfo.ExternalHostName, m_regInfo.ExternalEndPoint.Port,
|
new Caps(assetCache, httpListener, m_regInfo.ExternalHostName, m_regInfo.ExternalEndPoint.Port,
|
||||||
agent.CapsPath, agent.AgentID);
|
agent.CapsPath, agent.AgentID);
|
||||||
|
Util.SetCapsURL(agent.AgentID, "http://" + m_regInfo.ExternalHostName + ":" + httpListener.Port.ToString() + "/CAPS/" + agent.CapsPath + "0000/");
|
||||||
cap.RegisterHandlers();
|
cap.RegisterHandlers();
|
||||||
cap.AddNewInventoryItem = this.AddInventoryItem;
|
cap.AddNewInventoryItem = this.AddInventoryItem;
|
||||||
cap.ItemUpdatedCall = this.UpdateInventoryItemAsset;
|
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
|
//TODO: following line is hard coded to port 9000, really need to change this as soon as possible
|
||||||
AgentCircuitData circuitdata = remoteClient.RequestClientInfo();
|
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);
|
remoteClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), capsPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1111,7 +1113,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
item.assetID = asset.FullID;
|
item.assetID = asset.FullID;
|
||||||
userInfo.updateItem(remoteClient.AgentId, item);
|
userInfo.updateItem(remoteClient.AgentId, item);
|
||||||
|
|
||||||
remoteClient.SendInventoryItemUpdate(item);
|
// remoteClient.SendInventoryItemUpdate(item);
|
||||||
|
|
||||||
return (asset.FullID);
|
return (asset.FullID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ using libsecondlife.Packets;
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Framework.Interfaces;
|
using OpenSim.Framework.Interfaces;
|
||||||
using OpenSim.Framework.Types;
|
using OpenSim.Framework.Types;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
using OpenSim.Physics.Manager;
|
using OpenSim.Physics.Manager;
|
||||||
|
|
||||||
namespace OpenSim.Region.Environment.Scenes
|
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
|
//TODO: following line is hard coded to port 9000, really need to change this as soon as possible
|
||||||
AgentCircuitData circuitdata = this.ControllingClient.RequestClientInfo();
|
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.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, capsPath);
|
||||||
this.MakeChildAgent();
|
this.MakeChildAgent();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue