diff options
12 files changed, 161 insertions, 79 deletions
diff --git a/OpenSim/Framework/Servers/ServerBase.cs b/OpenSim/Framework/Servers/ServerBase.cs index 1a867fd..07a09e6 100644 --- a/OpenSim/Framework/Servers/ServerBase.cs +++ b/OpenSim/Framework/Servers/ServerBase.cs | |||
@@ -873,8 +873,8 @@ namespace OpenSim.Framework.Servers | |||
873 | 873 | ||
874 | protected string GetVersionText() | 874 | protected string GetVersionText() |
875 | { | 875 | { |
876 | return String.Format("Version: {0} (interface version {1}, SIMULATION/{2})", | 876 | return String.Format("Version: {0} (SIMULATION/{1} - SIMULATION/{2})", |
877 | m_version, VersionInfo.MajorInterfaceVersion, VersionInfo.SimulationServiceVersion); | 877 | m_version, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax); |
878 | } | 878 | } |
879 | 879 | ||
880 | /// <summary> | 880 | /// <summary> |
@@ -1045,4 +1045,4 @@ namespace OpenSim.Framework.Servers | |||
1045 | /// </summary> | 1045 | /// </summary> |
1046 | protected virtual void ShutdownSpecific() {} | 1046 | protected virtual void ShutdownSpecific() {} |
1047 | } | 1047 | } |
1048 | } \ No newline at end of file | 1048 | } |
diff --git a/OpenSim/Framework/VersionInfo.cs b/OpenSim/Framework/VersionInfo.cs index 54c4508..a145d34 100644 --- a/OpenSim/Framework/VersionInfo.cs +++ b/OpenSim/Framework/VersionInfo.cs | |||
@@ -61,7 +61,9 @@ namespace OpenSim | |||
61 | /// This is the external interface version. It is separate from the OpenSimulator project version. | 61 | /// This is the external interface version. It is separate from the OpenSimulator project version. |
62 | /// | 62 | /// |
63 | /// </value> | 63 | /// </value> |
64 | public readonly static int MajorInterfaceVersion = 8; | 64 | /// Commented because it's not used anymore, see below for new |
65 | /// versioning method. | ||
66 | //public readonly static int MajorInterfaceVersion = 8; | ||
65 | 67 | ||
66 | /// <summary> | 68 | /// <summary> |
67 | /// This rules versioning regarding teleports, and compatibility between simulators in that regard. | 69 | /// This rules versioning regarding teleports, and compatibility between simulators in that regard. |
@@ -80,6 +82,9 @@ namespace OpenSim | |||
80 | /// "SIMULATION/0.1" | 82 | /// "SIMULATION/0.1" |
81 | /// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before. | 83 | /// - this is an older teleport protocol used in OpenSimulator 0.7.5 and before. |
82 | /// </remarks> | 84 | /// </remarks> |
83 | public readonly static float SimulationServiceVersion = 0.3f; | 85 | public readonly static float SimulationServiceVersionAcceptedMin = 0.3f; |
86 | public readonly static float SimulationServiceVersionAcceptedMax = 0.4f; | ||
87 | public readonly static float SimulationServiceVersionSupportedMin = 0.3f; | ||
88 | public readonly static float SimulationServiceVersionSupportedMax = 0.4f; | ||
84 | } | 89 | } |
85 | } | 90 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 155a085..ab9f200 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -57,13 +57,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
57 | public const int DefaultMaxTransferDistance = 4095; | 57 | public const int DefaultMaxTransferDistance = 4095; |
58 | public const bool WaitForAgentArrivedAtDestinationDefault = true; | 58 | public const bool WaitForAgentArrivedAtDestinationDefault = true; |
59 | 59 | ||
60 | public static readonly string OutgoingTransferVersionName = "SIMULATION"; | ||
61 | |||
62 | /// <summary> | ||
63 | /// Determine the entity transfer version we will use for teleports. | ||
64 | /// </summary> | ||
65 | public static readonly float OutgoingTransferVersion = VersionInfo.SimulationServiceVersion; | ||
66 | |||
67 | /// <summary> | 60 | /// <summary> |
68 | /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. | 61 | /// The maximum distance, in standard region units (256m) that an agent is allowed to transfer. |
69 | /// </summary> | 62 | /// </summary> |
@@ -726,10 +719,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
726 | sp.Name, sp.Scene.Name, finalDestination.RegionName); | 719 | sp.Name, sp.Scene.Name, finalDestination.RegionName); |
727 | 720 | ||
728 | string reason; | 721 | string reason; |
729 | string version; | 722 | float version; |
730 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, OutgoingTransferVersion); | ||
731 | if (!Scene.SimulationService.QueryAccess( | 723 | if (!Scene.SimulationService.QueryAccess( |
732 | finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, myversion, sp.Scene.GetFormatsOffered(), out version, out reason)) | 724 | finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, sp.Scene.GetFormatsOffered(), out version, out reason)) |
733 | { | 725 | { |
734 | sp.ControllingClient.SendTeleportFailed(reason); | 726 | sp.ControllingClient.SendTeleportFailed(reason); |
735 | 727 | ||
@@ -746,8 +738,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
746 | m_interRegionTeleportAttempts.Value++; | 738 | m_interRegionTeleportAttempts.Value++; |
747 | 739 | ||
748 | m_log.DebugFormat( | 740 | m_log.DebugFormat( |
749 | "[ENTITY TRANSFER MODULE]: {0} transfer version is {1}/{2}, {3} version is {4}", | 741 | "[ENTITY TRANSFER MODULE]: {0} transfer version is SIMULATION/{2}, {3} version is {4}", |
750 | sp.Scene.Name, OutgoingTransferVersionName, OutgoingTransferVersion, finalDestination.RegionName, version); | 742 | sp.Scene.Name, version, finalDestination.RegionName, version); |
751 | 743 | ||
752 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from | 744 | // Fixing a bug where teleporting while sitting results in the avatar ending up removed from |
753 | // both regions | 745 | // both regions |
@@ -795,21 +787,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
795 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 787 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
796 | } | 788 | } |
797 | 789 | ||
798 | // We're going to fallback to V1 if the destination gives us anything smaller than 0.2 or we're forcing | 790 | // We're going to fallback to V1 if the destination gives us anything smaller than 0.2 |
799 | // use of the earlier protocol | 791 | if (version >= 0.2f) |
800 | float versionNumber = 0.1f; | ||
801 | string[] versionComponents = version.Split(new char[] { '/' }); | ||
802 | if (versionComponents.Length >= 2) | ||
803 | float.TryParse(versionComponents[1], out versionNumber); | ||
804 | |||
805 | if (versionNumber >= 0.2f) | ||
806 | TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); | 792 | TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); |
807 | else | 793 | else |
808 | TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); | 794 | TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason); |
809 | } | 795 | } |
810 | 796 | ||
811 | private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, | 797 | private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, |
812 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) | 798 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, float version, out string reason) |
813 | { | 799 | { |
814 | ulong destinationHandle = finalDestination.RegionHandle; | 800 | ulong destinationHandle = finalDestination.RegionHandle; |
815 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 801 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
@@ -1023,7 +1009,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1023 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); | 1009 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp); |
1024 | 1010 | ||
1025 | // For backwards compatibility | 1011 | // For backwards compatibility |
1026 | if (version == "Unknown" || version == string.Empty) | 1012 | if (version == 0f) |
1027 | { | 1013 | { |
1028 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it | 1014 | // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it |
1029 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); | 1015 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one..."); |
@@ -1064,7 +1050,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1064 | } | 1050 | } |
1065 | 1051 | ||
1066 | private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, | 1052 | private void TransferAgent_V2(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination, |
1067 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, string version, out string reason) | 1053 | IPEndPoint endPoint, uint teleportFlags, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, float version, out string reason) |
1068 | { | 1054 | { |
1069 | ulong destinationHandle = finalDestination.RegionHandle; | 1055 | ulong destinationHandle = finalDestination.RegionHandle; |
1070 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 1056 | AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); |
@@ -1444,9 +1430,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1444 | // point is actually in. | 1430 | // point is actually in. |
1445 | // Returns the coordinates and information of the new region or 'null' of it doesn't exist. | 1431 | // Returns the coordinates and information of the new region or 'null' of it doesn't exist. |
1446 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, | 1432 | public GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, |
1447 | out string version, out Vector3 newpos, out string failureReason) | 1433 | out float version, out Vector3 newpos, out string failureReason) |
1448 | { | 1434 | { |
1449 | version = String.Empty; | 1435 | version = 0f; |
1450 | newpos = pos; | 1436 | newpos = pos; |
1451 | failureReason = string.Empty; | 1437 | failureReason = string.Empty; |
1452 | string homeURI = scene.GetAgentHomeURI(agentID); | 1438 | string homeURI = scene.GetAgentHomeURI(agentID); |
@@ -1482,9 +1468,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1482 | } | 1468 | } |
1483 | 1469 | ||
1484 | // Check to see if we have access to the target region. | 1470 | // Check to see if we have access to the target region. |
1485 | string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, OutgoingTransferVersion); | ||
1486 | if (neighbourRegion != null | 1471 | if (neighbourRegion != null |
1487 | && !scene.SimulationService.QueryAccess(neighbourRegion, agentID, homeURI, false, newpos, myversion, scene.GetFormatsOffered(), out version, out failureReason)) | 1472 | && !scene.SimulationService.QueryAccess(neighbourRegion, agentID, homeURI, false, newpos, scene.GetFormatsOffered(), out version, out failureReason)) |
1488 | { | 1473 | { |
1489 | // remember banned | 1474 | // remember banned |
1490 | m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID); | 1475 | m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID); |
@@ -1515,7 +1500,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1515 | public bool Cross(ScenePresence agent, bool isFlying) | 1500 | public bool Cross(ScenePresence agent, bool isFlying) |
1516 | { | 1501 | { |
1517 | Vector3 newpos; | 1502 | Vector3 newpos; |
1518 | string version; | 1503 | float version; |
1519 | string failureReason; | 1504 | string failureReason; |
1520 | 1505 | ||
1521 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, | 1506 | GridRegion neighbourRegion = GetDestination(agent.Scene, agent.UUID, agent.AbsolutePosition, |
@@ -1627,7 +1612,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1627 | /// </summary> | 1612 | /// </summary> |
1628 | public ScenePresence CrossAgentToNewRegionAsync( | 1613 | public ScenePresence CrossAgentToNewRegionAsync( |
1629 | ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, | 1614 | ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, |
1630 | bool isFlying, string version) | 1615 | bool isFlying, float version) |
1631 | { | 1616 | { |
1632 | try | 1617 | try |
1633 | { | 1618 | { |
@@ -1703,7 +1688,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1703 | } | 1688 | } |
1704 | 1689 | ||
1705 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, | 1690 | public void CrossAgentToNewRegionPost(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, |
1706 | bool isFlying, string version) | 1691 | bool isFlying, float version) |
1707 | { | 1692 | { |
1708 | agent.ControllingClient.RequestClientInfo(); | 1693 | agent.ControllingClient.RequestClientInfo(); |
1709 | 1694 | ||
@@ -1756,7 +1741,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1756 | agent.SendOtherAgentsAppearanceToClient(); | 1741 | agent.SendOtherAgentsAppearanceToClient(); |
1757 | 1742 | ||
1758 | // Backwards compatibility. Best effort | 1743 | // Backwards compatibility. Best effort |
1759 | if (version == "Unknown" || version == string.Empty) | 1744 | if (version == 0f) |
1760 | { | 1745 | { |
1761 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); | 1746 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); |
1762 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | 1747 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 3800b3f..32ac992 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | |||
@@ -81,8 +81,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
81 | 81 | ||
82 | public void InitialiseService(IConfigSource configSource) | 82 | public void InitialiseService(IConfigSource configSource) |
83 | { | 83 | { |
84 | ServiceVersion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); | ||
85 | m_log.InfoFormat("[LOCAL SIMULATION CONNECTOR]: Initialized with connector protocol version {0}", ServiceVersion); | ||
86 | } | 84 | } |
87 | 85 | ||
88 | public void PostInitialise() | 86 | public void PostInitialise() |
@@ -251,10 +249,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
251 | return true; | 249 | return true; |
252 | } | 250 | } |
253 | 251 | ||
254 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string theirversion, List<UUID> features, out string version, out string reason) | 252 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, out float version, out string reason) |
255 | { | 253 | { |
256 | reason = "Communications failure"; | 254 | reason = "Communications failure"; |
257 | version = ServiceVersion; | 255 | version = VersionInfo.SimulationServiceVersionAcceptedMax; // If it's within the process, use max. If it's not, the connector will overwrite this |
258 | if (destination == null) | 256 | if (destination == null) |
259 | return false; | 257 | return false; |
260 | 258 | ||
@@ -265,17 +263,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
265 | // s.RegionInfo.RegionName, destination.RegionHandle); | 263 | // s.RegionInfo.RegionName, destination.RegionHandle); |
266 | uint size = m_scenes[destination.RegionID].RegionInfo.RegionSizeX; | 264 | uint size = m_scenes[destination.RegionID].RegionInfo.RegionSizeX; |
267 | 265 | ||
268 | float theirVersionNumber = 0f; | ||
269 | string[] versionComponents = theirversion.Split(new char[] { '/' }); | ||
270 | if (versionComponents.Length >= 2) | ||
271 | float.TryParse(versionComponents[1], out theirVersionNumber); | ||
272 | |||
273 | // Var regions here, and the requesting simulator is in an older version. | 266 | // Var regions here, and the requesting simulator is in an older version. |
274 | // We will forbide this, because it crashes the viewers | 267 | // We will forbide this, because it crashes the viewers |
275 | if (theirVersionNumber < 0.3f && size > 256) | 268 | if (version < 0.3f && size != 256) |
276 | { | 269 | { |
277 | reason = "Destination is a variable-sized region, and source is an old simulator. Consider upgrading."; | 270 | reason = "Destination is a variable-sized region, and source is an old simulator. Consider upgrading."; |
278 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Request to access this variable-sized region from {0} simulator was denied", theirVersionNumber); | 271 | m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Request to access this variable-sized region from older simulator was denied"); |
279 | return false; | 272 | return false; |
280 | 273 | ||
281 | } | 274 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index f963242..e2f52c4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs | |||
@@ -205,21 +205,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
205 | return m_remoteConnector.UpdateAgent(destination, cAgentData); | 205 | return m_remoteConnector.UpdateAgent(destination, cAgentData); |
206 | } | 206 | } |
207 | 207 | ||
208 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, List<UUID> features, out string version, out string reason) | 208 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, out float version, out string reason) |
209 | { | 209 | { |
210 | reason = "Communications failure"; | 210 | reason = "Communications failure"; |
211 | version = "Unknown"; | 211 | version = 0f; |
212 | 212 | ||
213 | if (destination == null) | 213 | if (destination == null) |
214 | return false; | 214 | return false; |
215 | 215 | ||
216 | // Try local first | 216 | // Try local first |
217 | if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, features, out version, out reason)) | 217 | if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, out version, out reason)) |
218 | return true; | 218 | return true; |
219 | 219 | ||
220 | // else do the remote thing | 220 | // else do the remote thing |
221 | if (!m_localBackend.IsLocalRegion(destination.RegionID)) | 221 | if (!m_localBackend.IsLocalRegion(destination.RegionID)) |
222 | return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, features, out version, out reason); | 222 | return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, out version, out reason); |
223 | 223 | ||
224 | return false; | 224 | return false; |
225 | } | 225 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 1ebef90..9e91d7d 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs | |||
@@ -35,7 +35,7 @@ using OpenSim.Region.Framework.Scenes; | |||
35 | 35 | ||
36 | namespace OpenSim.Region.Framework.Interfaces | 36 | namespace OpenSim.Region.Framework.Interfaces |
37 | { | 37 | { |
38 | public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); | 38 | public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, float version); |
39 | 39 | ||
40 | public interface IEntityTransferModule | 40 | public interface IEntityTransferModule |
41 | { | 41 | { |
@@ -92,12 +92,12 @@ namespace OpenSim.Region.Framework.Interfaces | |||
92 | 92 | ||
93 | void EnableChildAgent(ScenePresence agent, GridRegion region); | 93 | void EnableChildAgent(ScenePresence agent, GridRegion region); |
94 | 94 | ||
95 | GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out string version, | 95 | GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out float version, |
96 | out Vector3 newpos, out string reason); | 96 | out Vector3 newpos, out string reason); |
97 | 97 | ||
98 | void Cross(SceneObjectGroup sog, Vector3 position, bool silent); | 98 | void Cross(SceneObjectGroup sog, Vector3 position, bool silent); |
99 | 99 | ||
100 | ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); | 100 | ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, float version); |
101 | 101 | ||
102 | bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition); | 102 | bool HandleIncomingSceneObject(SceneObjectGroup so, Vector3 newPosition); |
103 | } | 103 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 1d89267..f5e2c9d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -480,7 +480,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
480 | ) | 480 | ) |
481 | { | 481 | { |
482 | IEntityTransferModule entityTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); | 482 | IEntityTransferModule entityTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>(); |
483 | string version = String.Empty; | 483 | float version = 0f; |
484 | Vector3 newpos = Vector3.Zero; | 484 | Vector3 newpos = Vector3.Zero; |
485 | string failureReason = String.Empty; | 485 | string failureReason = String.Empty; |
486 | OpenSim.Services.Interfaces.GridRegion destination = null; | 486 | OpenSim.Services.Interfaces.GridRegion destination = null; |
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 8b4518c..e0fa799 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | |||
@@ -145,9 +145,96 @@ namespace OpenSim.Server.Handlers.Simulation | |||
145 | if (args.ContainsKey("agent_home_uri")) | 145 | if (args.ContainsKey("agent_home_uri")) |
146 | agentHomeURI = args["agent_home_uri"].AsString(); | 146 | agentHomeURI = args["agent_home_uri"].AsString(); |
147 | 147 | ||
148 | string theirVersion = string.Empty; | 148 | // Decode the legacy (string) version and extract the number |
149 | float theirVersion = 0f; | ||
149 | if (args.ContainsKey("my_version")) | 150 | if (args.ContainsKey("my_version")) |
150 | theirVersion = args["my_version"].AsString(); | 151 | { |
152 | string theirVersionStr = args["my_version"].AsString(); | ||
153 | string[] parts = theirVersionStr.Split(new char[] {'/'}); | ||
154 | if (parts.Length > 1) | ||
155 | theirVersion = float.Parse(parts[1]); | ||
156 | } | ||
157 | |||
158 | // Decode the new versioning data | ||
159 | float minVersionRequired = 0f; | ||
160 | float maxVersionRequired = 0f; | ||
161 | float minVersionProvided = 0f; | ||
162 | float maxVersionProvided = 0f; | ||
163 | |||
164 | if (args.ContainsKey("simulation_service_supported_min")) | ||
165 | minVersionProvided = (float)args["simulation_service_supported_min"].AsReal(); | ||
166 | if (args.ContainsKey("simulation_service_supported_max")) | ||
167 | maxVersionProvided = (float)args["simulation_service_supported_max"].AsReal(); | ||
168 | |||
169 | if (args.ContainsKey("simulation_service_accepted_min")) | ||
170 | minVersionRequired = (float)args["simulation_service_accepted_min"].AsReal(); | ||
171 | if (args.ContainsKey("simulation_service_accepted_max")) | ||
172 | maxVersionRequired = (float)args["simulation_service_accepted_max"].AsReal(); | ||
173 | |||
174 | responsedata["int_response_code"] = HttpStatusCode.OK; | ||
175 | OSDMap resp = new OSDMap(3); | ||
176 | |||
177 | |||
178 | // If there is no version in the packet at all we're looking at 0.6 or | ||
179 | // even more ancient. Refuse it. | ||
180 | if (minVersionProvided == 0f && theirVersion == 0f) // 0.6 or earlier | ||
181 | { | ||
182 | resp["success"] = OSD.FromBoolean(false); | ||
183 | resp["reason"] = OSD.FromString("Version not supported"); | ||
184 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
185 | return; | ||
186 | } | ||
187 | |||
188 | float version; | ||
189 | |||
190 | if (minVersionProvided == 0f) // Legacy version | ||
191 | { | ||
192 | if (theirVersion >= VersionInfo.SimulationServiceVersionAcceptedMin && | ||
193 | theirVersion <= VersionInfo.SimulationServiceVersionAcceptedMax) | ||
194 | { | ||
195 | version = Math.Max(theirVersion, VersionInfo.SimulationServiceVersionAcceptedMax); | ||
196 | } | ||
197 | else | ||
198 | { | ||
199 | resp["success"] = OSD.FromBoolean(false); | ||
200 | resp["reason"] = OSD.FromString(String.Format("Your version is {0} and we accept only {1} - {2}", theirVersion, VersionInfo.SimulationServiceVersionAcceptedMin, VersionInfo.SimulationServiceVersionAcceptedMax)); | ||
201 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
202 | return; | ||
203 | } | ||
204 | } | ||
205 | else | ||
206 | { | ||
207 | // Test for no overlap | ||
208 | if (minVersionProvided > VersionInfo.SimulationServiceVersionAcceptedMax || | ||
209 | maxVersionProvided < VersionInfo.SimulationServiceVersionAcceptedMin) | ||
210 | { | ||
211 | resp["success"] = OSD.FromBoolean(false); | ||
212 | resp["reason"] = OSD.FromString(String.Format("You provide versions {0} - {1} and we accept only {2} - {3}. No version overlap.", minVersionProvided, maxVersionProvided, VersionInfo.SimulationServiceVersionAcceptedMin, VersionInfo.SimulationServiceVersionAcceptedMax)); | ||
213 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
214 | return; | ||
215 | } | ||
216 | if (minVersionRequired > VersionInfo.SimulationServiceVersionSupportedMax || | ||
217 | maxVersionRequired < VersionInfo.SimulationServiceVersionSupportedMin) | ||
218 | { | ||
219 | resp["success"] = OSD.FromBoolean(false); | ||
220 | resp["reason"] = OSD.FromString(String.Format("You require versions {0} - {1} and we provide only {2} - {3}. No version overlap.", minVersionRequired, maxVersionRequired, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax)); | ||
221 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
222 | return; | ||
223 | } | ||
224 | |||
225 | // Determine version to use | ||
226 | version = Math.Max(Math.Max(maxVersionProvided, VersionInfo.SimulationServiceVersionAcceptedMax), Math.Max(maxVersionRequired, VersionInfo.SimulationServiceVersionSupportedMax)); | ||
227 | if (version < VersionInfo.SimulationServiceVersionAcceptedMin || | ||
228 | version > VersionInfo.SimulationServiceVersionAcceptedMax || | ||
229 | version < VersionInfo.SimulationServiceVersionSupportedMin || | ||
230 | version > VersionInfo.SimulationServiceVersionSupportedMax) | ||
231 | { | ||
232 | resp["success"] = OSD.FromBoolean(false); | ||
233 | resp["reason"] = OSD.FromString(String.Format("The protocol version we determined, {0}, is incompatible with the version windows, {1} - {2} and {3} - {4}. No version overlap.", version, VersionInfo.SimulationServiceVersionAcceptedMin, VersionInfo.SimulationServiceVersionAcceptedMax, VersionInfo.SimulationServiceVersionSupportedMin, VersionInfo.SimulationServiceVersionSupportedMax)); | ||
234 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp, true); | ||
235 | return; | ||
236 | } | ||
237 | } | ||
151 | 238 | ||
152 | List<UUID> features = new List<UUID>(); | 239 | List<UUID> features = new List<UUID>(); |
153 | 240 | ||
@@ -163,16 +250,14 @@ namespace OpenSim.Server.Handlers.Simulation | |||
163 | destination.RegionID = regionID; | 250 | destination.RegionID = regionID; |
164 | 251 | ||
165 | string reason; | 252 | string reason; |
166 | string version; | 253 | float dummyVersion; |
167 | bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, theirVersion, features, out version, out reason); | 254 | bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, features, out dummyVersion, out reason); |
168 | |||
169 | responsedata["int_response_code"] = HttpStatusCode.OK; | ||
170 | |||
171 | OSDMap resp = new OSDMap(3); | ||
172 | 255 | ||
173 | resp["success"] = OSD.FromBoolean(result); | 256 | resp["success"] = OSD.FromBoolean(result); |
174 | resp["reason"] = OSD.FromString(reason); | 257 | resp["reason"] = OSD.FromString(reason); |
175 | resp["version"] = OSD.FromString(version); | 258 | string legacyVersion = String.Format("SIMULATION/{0}", version); |
259 | resp["version"] = OSD.FromString(legacyVersion); | ||
260 | resp["negotiated_version"] = OSD.FromReal(version); | ||
176 | resp["variable_wearables_count_supported"] = OSD.FromBoolean(true); | 261 | resp["variable_wearables_count_supported"] = OSD.FromBoolean(true); |
177 | 262 | ||
178 | OSDArray featuresWanted = new OSDArray(); | 263 | OSDArray featuresWanted = new OSDArray(); |
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 1eedbef..5ee2c9c 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | |||
@@ -282,10 +282,10 @@ namespace OpenSim.Services.Connectors.Simulation | |||
282 | } | 282 | } |
283 | 283 | ||
284 | 284 | ||
285 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string myversion, List<UUID> featuresAvailable, out string version, out string reason) | 285 | public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> featuresAvailable, out float version, out string reason) |
286 | { | 286 | { |
287 | reason = "Failed to contact destination"; | 287 | reason = "Failed to contact destination"; |
288 | version = "Unknown"; | 288 | version = 0f; |
289 | 289 | ||
290 | // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); | 290 | // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); |
291 | 291 | ||
@@ -298,7 +298,14 @@ namespace OpenSim.Services.Connectors.Simulation | |||
298 | OSDMap request = new OSDMap(); | 298 | OSDMap request = new OSDMap(); |
299 | request.Add("viaTeleport", OSD.FromBoolean(viaTeleport)); | 299 | request.Add("viaTeleport", OSD.FromBoolean(viaTeleport)); |
300 | request.Add("position", OSD.FromString(position.ToString())); | 300 | request.Add("position", OSD.FromString(position.ToString())); |
301 | request.Add("my_version", OSD.FromString(myversion)); | 301 | // To those who still understad this field, we're telling them |
302 | // the lowest version just to be safe | ||
303 | request.Add("my_version", OSD.FromString(String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersionSupportedMin))); | ||
304 | // New simulation service negotiation | ||
305 | request.Add("simulation_service_supported_min", OSD.FromReal(VersionInfo.SimulationServiceVersionSupportedMin)); | ||
306 | request.Add("simulation_service_supported_max", OSD.FromReal(VersionInfo.SimulationServiceVersionSupportedMax)); | ||
307 | request.Add("simulation_service_accepted_min", OSD.FromReal(VersionInfo.SimulationServiceVersionAcceptedMin)); | ||
308 | request.Add("simulation_service_accepted_max", OSD.FromReal(VersionInfo.SimulationServiceVersionAcceptedMax)); | ||
302 | 309 | ||
303 | OSDArray features = new OSDArray(); | 310 | OSDArray features = new OSDArray(); |
304 | foreach (UUID feature in featuresAvailable) | 311 | foreach (UUID feature in featuresAvailable) |
@@ -322,15 +329,24 @@ namespace OpenSim.Services.Connectors.Simulation | |||
322 | success = data["success"]; | 329 | success = data["success"]; |
323 | 330 | ||
324 | reason = data["reason"].AsString(); | 331 | reason = data["reason"].AsString(); |
325 | if (data["version"] != null && data["version"].AsString() != string.Empty) | 332 | if (data["negotiated_version"] != null) |
326 | version = data["version"].AsString(); | 333 | { |
334 | version = (float)data["negotiated_version"].AsReal(); | ||
335 | } | ||
336 | else if (data["version"] != null && data["version"].AsString() != string.Empty) | ||
337 | { | ||
338 | string versionString = data["version"].AsString(); | ||
339 | String[] parts = versionString.Split(new char[] {'/'}); | ||
340 | if (parts.Length > 1) | ||
341 | version = float.Parse(parts[1]); | ||
342 | } | ||
327 | 343 | ||
328 | m_log.DebugFormat( | 344 | m_log.DebugFormat( |
329 | "[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version {3} ({4})", | 345 | "[REMOTE SIMULATION CONNECTOR]: QueryAccess to {0} returned {1}, reason {2}, version SIMULATION/{3}", |
330 | uri, success, reason, version, data["version"].AsString()); | 346 | uri, success, reason, version); |
331 | } | 347 | } |
332 | 348 | ||
333 | if (!success) | 349 | if (!success || version == 0f) |
334 | { | 350 | { |
335 | // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the | 351 | // If we don't check this then OpenSimulator 0.7.3.1 and some period before will never see the |
336 | // actual failure message | 352 | // actual failure message |
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index bee3db3..a2c5327 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs | |||
@@ -452,12 +452,11 @@ namespace OpenSim.Services.HypergridService | |||
452 | 452 | ||
453 | m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0}, Teleport Flags: {1}", aCircuit.Name, loginFlag); | 453 | m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0}, Teleport Flags: {1}", aCircuit.Name, loginFlag); |
454 | 454 | ||
455 | string version; | 455 | float version; |
456 | 456 | ||
457 | string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); | ||
458 | if (!m_SimulationService.QueryAccess( | 457 | if (!m_SimulationService.QueryAccess( |
459 | destination, aCircuit.AgentID, aCircuit.ServiceURLs["HomeURI"].ToString(), | 458 | destination, aCircuit.AgentID, aCircuit.ServiceURLs["HomeURI"].ToString(), |
460 | true, aCircuit.startpos, myversion, new List<UUID>(), out version, out reason)) | 459 | true, aCircuit.startpos, new List<UUID>(), out version, out reason)) |
461 | return false; | 460 | return false; |
462 | 461 | ||
463 | return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, out reason); | 462 | return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, out reason); |
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs index 42c414d..6f205ad 100644 --- a/OpenSim/Services/Interfaces/ISimulationService.cs +++ b/OpenSim/Services/Interfaces/ISimulationService.cs | |||
@@ -92,7 +92,7 @@ namespace OpenSim.Services.Interfaces | |||
92 | /// <param name="version">Version that the target simulator is running</param> | 92 | /// <param name="version">Version that the target simulator is running</param> |
93 | /// <param name="reason">[out] Optional error message</param> | 93 | /// <param name="reason">[out] Optional error message</param> |
94 | /// <returns>True: ok; False: not allowed</returns> | 94 | /// <returns>True: ok; False: not allowed</returns> |
95 | bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, List<UUID> features, out string version, out string reason); | 95 | bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, out float version, out string reason); |
96 | 96 | ||
97 | /// <summary> | 97 | /// <summary> |
98 | /// Message from receiving region to departing region, telling it got contacted by the client. | 98 | /// Message from receiving region to departing region, telling it got contacted by the client. |
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 9e12f9d..4f8f459 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -983,11 +983,10 @@ namespace OpenSim.Services.LLLoginService | |||
983 | 983 | ||
984 | private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) | 984 | private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) |
985 | { | 985 | { |
986 | string myversion = String.Format("SIMULATION/{0}", VersionInfo.SimulationServiceVersion); | 986 | float version; |
987 | string version; | ||
988 | 987 | ||
989 | if (!simConnector.QueryAccess( | 988 | if (!simConnector.QueryAccess( |
990 | region, aCircuit.AgentID, null, true, aCircuit.startpos, myversion, new List<UUID>(), out version, out reason)) | 989 | region, aCircuit.AgentID, null, true, aCircuit.startpos, new List<UUID>(), out version, out reason)) |
991 | return false; | 990 | return false; |
992 | 991 | ||
993 | return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); | 992 | return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason); |