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.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<LLUUID, string> capsURLS = new Dictionary<LLUUID, string>();
|
||||
|
||||
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -369,124 +369,6 @@ namespace OpenSim.Framework.UserManagement
|
|||
}
|
||||
}
|
||||
|
||||
// Rest and XML-RPC methods. (could move 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
|
||||
|
||||
// Rest and XML-RPC methods. (have moved them to a sub class in the user server)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
@ -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.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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue