diff options
author | Justin Clarke Casey | 2008-03-20 20:04:45 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-03-20 20:04:45 +0000 |
commit | c1beb85315aad09197ca7ffaa8ec194346af82cb (patch) | |
tree | 2554ed107ef378a3fdab9ec23d6760a6962a92a0 /OpenSim/Region/Environment | |
parent | Added back a fix that lbsa71 did aqes ago to fix a buffer overflow in the pac... (diff) | |
download | opensim-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/Environment')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 100 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneBase.cs | 15 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/ScenePresence.cs | 11 |
4 files changed, 85 insertions, 49 deletions
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 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | ||
29 | using libsecondlife; | 30 | using libsecondlife; |
30 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
31 | using OpenSim.Framework.Communications.Cache; | 32 | using 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(); |