From c1beb85315aad09197ca7ffaa8ec194346af82cb Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Thu, 20 Mar 2008 20:04:45 +0000
Subject: * First draft resolution of mantis 777, 734, 389 - scripts do not
save in non-home regions * Should work in multi-region standalone and grid
modes * This should also solve other non-home region caps issues (map
requests, RC client inventory requests, etc) * We now pass CAPS information
on to the destination region on region crossing, and set up a CAPS object
when an agent becomes a master * Current limitation is that this will only
work if your http_listener_port is 9000 * This is a very early code cut (lots
of bad practice, hard coding and inefficiency). However, I wanted to get
this out there for feedback and my own sanity. Next few patches will clean
up the mess.
---
OpenSim/Region/Environment/Scenes/Scene.cs | 100 +++++++++++----------
OpenSim/Region/Environment/Scenes/SceneBase.cs | 15 ++++
.../Scenes/SceneCommunicationService.cs | 8 +-
OpenSim/Region/Environment/Scenes/ScenePresence.cs | 11 ++-
4 files changed, 85 insertions(+), 49 deletions(-)
(limited to 'OpenSim/Region/Environment/Scenes')
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index e036a3a..7948a6f 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1649,53 +1649,11 @@ namespace OpenSim.Region.Environment.Scenes
{
if (regionHandle == m_regInfo.RegionHandle)
{
- if (agent.CapsPath != String.Empty)
- {
- m_log.DebugFormat(
- "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}",
- agent.AgentID, agent.CapsPath, RegionInfo.RegionName);
+ capsPaths[agent.AgentID] = agent.CapsPath;
- Caps cap =
- new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port,
- agent.CapsPath, agent.AgentID, m_dumpAssetsToFile);
-
- Util.SetCapsURL(agent.AgentID,
- "http://" + m_regInfo.ExternalHostName + ":" + m_httpListener.Port.ToString() +
- "/CAPS/" + agent.CapsPath + "0000/");
- cap.RegisterHandlers();
- if (agent.child)
- {
-
- }
- cap.AddNewInventoryItem = AddInventoryItem;
- cap.ItemUpdatedCall = CapsUpdateInventoryItemAsset;
- cap.TaskScriptUpdatedCall = CapsUpdateTaskInventoryScriptAsset;
- cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS;
-
- if (m_capsHandlers.ContainsKey(agent.AgentID))
- {
- m_log.DebugFormat(
- "[CONNECTION DEBUGGING]: Caps path already in use for avatar {0} in region {1}",
- agent.AgentID, RegionInfo.RegionName);
-
- try
- {
- m_capsHandlers[agent.AgentID] = cap;
- }
- catch (KeyNotFoundException)
- {
- m_log.DebugFormat(
- "[CONNECTION DEBUGGING]: Caught exception adding handler for avatar {0} at {1}",
- agent.AgentID, RegionInfo.RegionName);
-
- // Fix for a potential race condition.
- m_capsHandlers.Add(agent.AgentID, cap);
- }
- }
- else
- {
- m_capsHandlers.Add(agent.AgentID, cap);
- }
+ if (!agent.child)
+ {
+ AddCapsHandler(agent.AgentID);
}
else
{
@@ -1716,6 +1674,56 @@ namespace OpenSim.Region.Environment.Scenes
"[CONNECTION DEBUGGING]: Skipping this region for welcoming avatar {0} [{1}] at {2}",
agent.AgentID, regionHandle, RegionInfo.RegionName);
}
+ }
+
+ ///
+ /// Add a caps handler for the given agent.
+ ///
+ ///
+ ///
+ public void AddCapsHandler(LLUUID agentId)
+ {
+ String capsObjectPath = GetCapsPath(agentId);
+
+ m_log.DebugFormat(
+ "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}",
+ agentId, capsObjectPath, RegionInfo.RegionName);
+
+ Caps cap =
+ new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port,
+ capsObjectPath, agentId, m_dumpAssetsToFile);
+
+ cap.RegisterHandlers();
+
+ cap.AddNewInventoryItem = AddInventoryItem;
+ cap.ItemUpdatedCall = CapsUpdateInventoryItemAsset;
+ cap.TaskScriptUpdatedCall = CapsUpdateTaskInventoryScriptAsset;
+ cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS;
+
+ if (m_capsHandlers.ContainsKey(agentId))
+ {
+ m_log.DebugFormat(
+ "[CONNECTION DEBUGGING]: Caps path already in use for avatar {0} in region {1}",
+ agentId, RegionInfo.RegionName);
+
+ try
+ {
+ m_capsHandlers[agentId] = cap;
+ }
+ catch (KeyNotFoundException)
+ {
+ m_log.DebugFormat(
+ "[CONNECTION DEBUGGING]: Caught exception adding handler for avatar {0} at {1}",
+ agentId, RegionInfo.RegionName);
+
+ // Fix for a potential race condition.
+ m_capsHandlers.Add(agentId, cap);
+ }
+ }
+ else
+ {
+ m_capsHandlers.Add(agentId, cap);
+ }
}
///
diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs
index 2cc5c4f..4002aaf 100644
--- a/OpenSim/Region/Environment/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Collections.Generic;
using libsecondlife;
using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
@@ -196,5 +197,19 @@ namespace OpenSim.Region.Environment.Scenes
}
#endregion
+
+ ///
+ /// XXX These two methods are very temporary
+ ///
+ protected Dictionary capsPaths = new Dictionary();
+ public string GetCapsPath(LLUUID agentId)
+ {
+ if (capsPaths.ContainsKey(agentId))
+ {
+ return capsPaths[agentId];
+ }
+
+ return null;
+ }
}
}
diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
index e51c58d..d9c34e4 100644
--- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs
@@ -483,7 +483,7 @@ namespace OpenSim.Region.Environment.Scenes
}
///
- ///
+ /// Try to teleport an agent to a new region.
///
///
///
@@ -530,7 +530,11 @@ namespace OpenSim.Region.Environment.Scenes
m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
position, false);
AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
- string capsPath = Util.GetCapsURL(avatar.ControllingClient.AgentId);
+
+ // TODO Should construct this behind a method
+ string capsPath =
+ "http://" + reg.ExternalHostName + ":" + 9000 + "/CAPS/" + circuitdata.CapsPath + "0000/";
+
avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
capsPath);
avatar.MakeChildAgent();
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 050bf95..67a4b97 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -545,6 +545,7 @@ namespace OpenSim.Region.Environment.Scenes
m_scene.SwapRootAgentCount(false);
m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid);
+ m_scene.AddCapsHandler(m_uuid);
//if (!m_gotAllObjectsInScene)
//{
m_scene.SendAllSceneObjectsToClient(this);
@@ -1616,7 +1617,15 @@ namespace OpenSim.Region.Environment.Scenes
if (res)
{
AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
- string capsPath = Util.GetCapsURL(m_controllingClient.AgentId);
+
+ // TODO Should construct this behind a method
+ string capsPath =
+ "http://" + neighbourRegion.ExternalHostName + ":" + 9000
+ + "/CAPS/" + circuitdata.CapsPath + "0000/";
+
+ m_log.DebugFormat(
+ "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid);
+
m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint,
capsPath);
MakeChildAgent();
--
cgit v1.1