aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clarke Casey2008-03-20 20:04:45 +0000
committerJustin Clarke Casey2008-03-20 20:04:45 +0000
commitc1beb85315aad09197ca7ffaa8ec194346af82cb (patch)
tree2554ed107ef378a3fdab9ec23d6760a6962a92a0 /OpenSim/Region
parentAdded back a fix that lbsa71 did aqes ago to fix a buffer overflow in the pac... (diff)
downloadopensim-SC-c1beb85315aad09197ca7ffaa8ec194346af82cb.zip
opensim-SC-c1beb85315aad09197ca7ffaa8ec194346af82cb.tar.gz
opensim-SC-c1beb85315aad09197ca7ffaa8ec194346af82cb.tar.bz2
opensim-SC-c1beb85315aad09197ca7ffaa8ec194346af82cb.tar.xz
* 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.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs100
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneBase.cs15
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs8
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs11
5 files changed, 86 insertions, 50 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 3a763c8..f1ecc8a 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -984,7 +984,7 @@ namespace OpenSim.Region.ClientStack
984 agentData.child = false; 984 agentData.child = false;
985 agentData.firstname = m_firstName; 985 agentData.firstname = m_firstName;
986 agentData.lastname = m_lastName; 986 agentData.lastname = m_lastName;
987 agentData.CapsPath = String.Empty; 987 agentData.CapsPath = m_scene.GetCapsPath(m_agentId);
988 return agentData; 988 return agentData;
989 } 989 }
990 990
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
1649 { 1649 {
1650 if (regionHandle == m_regInfo.RegionHandle) 1650 if (regionHandle == m_regInfo.RegionHandle)
1651 { 1651 {
1652 if (agent.CapsPath != String.Empty) 1652 capsPaths[agent.AgentID] = agent.CapsPath;
1653 {
1654 m_log.DebugFormat(
1655 "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}",
1656 agent.AgentID, agent.CapsPath, RegionInfo.RegionName);
1657 1653
1658 Caps cap = 1654 if (!agent.child)
1659 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port, 1655 {
1660 agent.CapsPath, agent.AgentID, m_dumpAssetsToFile); 1656 AddCapsHandler(agent.AgentID);
1661
1662 Util.SetCapsURL(agent.AgentID,
1663 "http://" + m_regInfo.ExternalHostName + ":" + m_httpListener.Port.ToString() +
1664 "/CAPS/" + agent.CapsPath + "0000/");
1665 cap.RegisterHandlers();
1666 if (agent.child)
1667 {
1668
1669 }
1670 cap.AddNewInventoryItem = AddInventoryItem;
1671 cap.ItemUpdatedCall = CapsUpdateInventoryItemAsset;
1672 cap.TaskScriptUpdatedCall = CapsUpdateTaskInventoryScriptAsset;
1673 cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS;
1674
1675 if (m_capsHandlers.ContainsKey(agent.AgentID))
1676 {
1677 m_log.DebugFormat(
1678 "[CONNECTION DEBUGGING]: Caps path already in use for avatar {0} in region {1}",
1679 agent.AgentID, RegionInfo.RegionName);
1680
1681 try
1682 {
1683 m_capsHandlers[agent.AgentID] = cap;
1684 }
1685 catch (KeyNotFoundException)
1686 {
1687 m_log.DebugFormat(
1688 "[CONNECTION DEBUGGING]: Caught exception adding handler for avatar {0} at {1}",
1689 agent.AgentID, RegionInfo.RegionName);
1690
1691 // Fix for a potential race condition.
1692 m_capsHandlers.Add(agent.AgentID, cap);
1693 }
1694 }
1695 else
1696 {
1697 m_capsHandlers.Add(agent.AgentID, cap);
1698 }
1699 } 1657 }
1700 else 1658 else
1701 { 1659 {
@@ -1716,6 +1674,56 @@ namespace OpenSim.Region.Environment.Scenes
1716 "[CONNECTION DEBUGGING]: Skipping this region for welcoming avatar {0} [{1}] at {2}", 1674 "[CONNECTION DEBUGGING]: Skipping this region for welcoming avatar {0} [{1}] at {2}",
1717 agent.AgentID, regionHandle, RegionInfo.RegionName); 1675 agent.AgentID, regionHandle, RegionInfo.RegionName);
1718 } 1676 }
1677 }
1678
1679 /// <summary>
1680 /// Add a caps handler for the given agent.
1681 /// </summary>
1682 /// <param name="agentId"></param>
1683 /// <param name="capsObjectPath"></param>
1684 public void AddCapsHandler(LLUUID agentId)
1685 {
1686 String capsObjectPath = GetCapsPath(agentId);
1687
1688 m_log.DebugFormat(
1689 "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}",
1690 agentId, capsObjectPath, RegionInfo.RegionName);
1691
1692 Caps cap =
1693 new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port,
1694 capsObjectPath, agentId, m_dumpAssetsToFile);
1695
1696 cap.RegisterHandlers();
1697
1698 cap.AddNewInventoryItem = AddInventoryItem;
1699 cap.ItemUpdatedCall = CapsUpdateInventoryItemAsset;
1700 cap.TaskScriptUpdatedCall = CapsUpdateTaskInventoryScriptAsset;
1701 cap.CAPSFetchInventoryDescendents = CommsManager.UserProfileCacheService.HandleFetchInventoryDescendentsCAPS;
1702
1703 if (m_capsHandlers.ContainsKey(agentId))
1704 {
1705 m_log.DebugFormat(
1706 "[CONNECTION DEBUGGING]: Caps path already in use for avatar {0} in region {1}",
1707 agentId, RegionInfo.RegionName);
1708
1709 try
1710 {
1711 m_capsHandlers[agentId] = cap;
1712 }
1713 catch (KeyNotFoundException)
1714 {
1715 m_log.DebugFormat(
1716 "[CONNECTION DEBUGGING]: Caught exception adding handler for avatar {0} at {1}",
1717 agentId, RegionInfo.RegionName);
1718
1719 // Fix for a potential race condition.
1720 m_capsHandlers.Add(agentId, cap);
1721 }
1722 }
1723 else
1724 {
1725 m_capsHandlers.Add(agentId, cap);
1726 }
1719 } 1727 }
1720 1728
1721 /// <summary> 1729 /// <summary>
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 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic;
29using libsecondlife; 30using libsecondlife;
30using OpenSim.Framework; 31using OpenSim.Framework;
31using OpenSim.Framework.Communications.Cache; 32using OpenSim.Framework.Communications.Cache;
@@ -196,5 +197,19 @@ namespace OpenSim.Region.Environment.Scenes
196 } 197 }
197 198
198 #endregion 199 #endregion
200
201 /// <summary>
202 /// XXX These two methods are very temporary
203 /// </summary>
204 protected Dictionary<LLUUID, String> capsPaths = new Dictionary<LLUUID, String>();
205 public string GetCapsPath(LLUUID agentId)
206 {
207 if (capsPaths.ContainsKey(agentId))
208 {
209 return capsPaths[agentId];
210 }
211
212 return null;
213 }
199 } 214 }
200} 215}
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
483 } 483 }
484 484
485 /// <summary> 485 /// <summary>
486 /// 486 /// Try to teleport an agent to a new region.
487 /// </summary> 487 /// </summary>
488 /// <param name="remoteClient"></param> 488 /// <param name="remoteClient"></param>
489 /// <param name="RegionHandle"></param> 489 /// <param name="RegionHandle"></param>
@@ -530,7 +530,11 @@ namespace OpenSim.Region.Environment.Scenes
530 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, 530 m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
531 position, false); 531 position, false);
532 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo(); 532 AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
533 string capsPath = Util.GetCapsURL(avatar.ControllingClient.AgentId); 533
534 // TODO Should construct this behind a method
535 string capsPath =
536 "http://" + reg.ExternalHostName + ":" + 9000 + "/CAPS/" + circuitdata.CapsPath + "0000/";
537
534 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), 538 avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
535 capsPath); 539 capsPath);
536 avatar.MakeChildAgent(); 540 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
545 545
546 m_scene.SwapRootAgentCount(false); 546 m_scene.SwapRootAgentCount(false);
547 m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid); 547 m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid);
548 m_scene.AddCapsHandler(m_uuid);
548 //if (!m_gotAllObjectsInScene) 549 //if (!m_gotAllObjectsInScene)
549 //{ 550 //{
550 m_scene.SendAllSceneObjectsToClient(this); 551 m_scene.SendAllSceneObjectsToClient(this);
@@ -1616,7 +1617,15 @@ namespace OpenSim.Region.Environment.Scenes
1616 if (res) 1617 if (res)
1617 { 1618 {
1618 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); 1619 AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
1619 string capsPath = Util.GetCapsURL(m_controllingClient.AgentId); 1620
1621 // TODO Should construct this behind a method
1622 string capsPath =
1623 "http://" + neighbourRegion.ExternalHostName + ":" + 9000
1624 + "/CAPS/" + circuitdata.CapsPath + "0000/";
1625
1626 m_log.DebugFormat(
1627 "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid);
1628
1620 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, 1629 m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint,
1621 capsPath); 1630 capsPath);
1622 MakeChildAgent(); 1631 MakeChildAgent();