diff options
Diffstat (limited to '')
3 files changed, 5 insertions, 105 deletions
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/CameraOnlyModeModule.cs b/OpenSim/Region/OptionalModules/ViewerSupport/CameraOnlyModeModule.cs index 7ae4223..770b1f2 100644 --- a/OpenSim/Region/OptionalModules/ViewerSupport/CameraOnlyModeModule.cs +++ b/OpenSim/Region/OptionalModules/ViewerSupport/CameraOnlyModeModule.cs | |||
@@ -108,8 +108,7 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
108 | { | 108 | { |
109 | if (m_Enabled) | 109 | if (m_Enabled) |
110 | { | 110 | { |
111 | IEntityTransferModule et = m_scene.RequestModuleInterface<IEntityTransferModule>(); | 111 | m_Helper = new SimulatorFeaturesHelper(scene); |
112 | m_Helper = new SimulatorFeaturesHelper(scene, et); | ||
113 | 112 | ||
114 | ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface<ISimulatorFeaturesModule>(); | 113 | ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface<ISimulatorFeaturesModule>(); |
115 | if (featuresModule != null) | 114 | if (featuresModule != null) |
@@ -124,7 +123,7 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
124 | private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) | 123 | private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) |
125 | { | 124 | { |
126 | m_log.DebugFormat("[CAMERA-ONLY MODE]: OnSimulatorFeaturesRequest in {0}", m_scene.RegionInfo.RegionName); | 125 | m_log.DebugFormat("[CAMERA-ONLY MODE]: OnSimulatorFeaturesRequest in {0}", m_scene.RegionInfo.RegionName); |
127 | if (m_Helper.ShouldSend(agentID) && m_Helper.UserLevel(agentID) <= m_UserLevel) | 126 | if (m_Helper.UserLevel(agentID) <= m_UserLevel) |
128 | { | 127 | { |
129 | OSDMap extrasMap; | 128 | OSDMap extrasMap; |
130 | if (features.ContainsKey("OpenSimExtras")) | 129 | if (features.ContainsKey("OpenSimExtras")) |
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/SimulatorFeaturesHelper.cs b/OpenSim/Region/OptionalModules/ViewerSupport/SimulatorFeaturesHelper.cs index 2661522..1ae18dd 100644 --- a/OpenSim/Region/OptionalModules/ViewerSupport/SimulatorFeaturesHelper.cs +++ b/OpenSim/Region/OptionalModules/ViewerSupport/SimulatorFeaturesHelper.cs | |||
@@ -53,86 +53,11 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
53 | { | 53 | { |
54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 54 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
55 | 55 | ||
56 | private IEntityTransferModule m_TransferModule; | ||
57 | private Scene m_scene; | 56 | private Scene m_scene; |
58 | 57 | ||
59 | private struct RegionSend { | 58 | public SimulatorFeaturesHelper(Scene scene) |
60 | public UUID region; | ||
61 | public bool send; | ||
62 | }; | ||
63 | // Using a static cache so that we don't have to perform the time-consuming tests | ||
64 | // in ShouldSend on Extra SimFeatures that go on the same response but come from | ||
65 | // different modules. | ||
66 | // This cached is indexed on the agentID and maps to a list of regions | ||
67 | private static ExpiringCache<UUID, List<RegionSend>> m_Cache = new ExpiringCache<UUID, List<RegionSend>>(); | ||
68 | private const double TIMEOUT = 1.0; // time in cache | ||
69 | |||
70 | public SimulatorFeaturesHelper(Scene scene, IEntityTransferModule et) | ||
71 | { | 59 | { |
72 | m_scene = scene; | 60 | m_scene = scene; |
73 | m_TransferModule = et; | ||
74 | } | ||
75 | |||
76 | public bool ShouldSend(UUID agentID) | ||
77 | { | ||
78 | List<RegionSend> rsendlist; | ||
79 | RegionSend rsend; | ||
80 | if (m_Cache.TryGetValue(agentID, out rsendlist)) | ||
81 | { | ||
82 | rsend = rsendlist.Find(r => r.region == m_scene.RegionInfo.RegionID); | ||
83 | if (rsend.region != UUID.Zero) // Found it | ||
84 | { | ||
85 | return rsend.send; | ||
86 | } | ||
87 | } | ||
88 | |||
89 | // Relatively complex logic for deciding whether to send the extra SimFeature or not. | ||
90 | // This is because the viewer calls this cap to all sims that it knows about, | ||
91 | // including the departing sims and non-neighbors (those that are cached). | ||
92 | rsend.region = m_scene.RegionInfo.RegionID; | ||
93 | rsend.send = false; | ||
94 | IClientAPI client = null; | ||
95 | int counter = 200; | ||
96 | |||
97 | // Let's wait a little to see if we get a client here | ||
98 | while (!m_scene.TryGetClient(agentID, out client) && counter-- > 0) | ||
99 | Thread.Sleep(50); | ||
100 | |||
101 | if (client != null) | ||
102 | { | ||
103 | ScenePresence sp = WaitGetScenePresence(agentID); | ||
104 | |||
105 | if (sp != null) | ||
106 | { | ||
107 | // On the receiving region, the call to this cap may arrive before | ||
108 | // the agent is root. Make sure we only proceed from here when the agent | ||
109 | // has been made root | ||
110 | counter = 200; | ||
111 | while ((sp.IsInTransit || sp.IsChildAgent) && counter-- > 0) | ||
112 | { | ||
113 | Thread.Sleep(50); | ||
114 | } | ||
115 | |||
116 | // The viewer calls this cap on the departing sims too. Make sure | ||
117 | // that we only proceed after the agent is not in transit anymore. | ||
118 | // The agent must be root and not going anywhere | ||
119 | if (!sp.IsChildAgent && !m_TransferModule.IsInTransit(agentID)) | ||
120 | rsend.send = true; | ||
121 | |||
122 | } | ||
123 | } | ||
124 | //else | ||
125 | // m_log.DebugFormat("[XXX]: client is null"); | ||
126 | |||
127 | |||
128 | if (rsendlist == null) | ||
129 | { | ||
130 | rsendlist = new List<RegionSend>(); | ||
131 | m_Cache.AddOrUpdate(agentID, rsendlist, TIMEOUT); | ||
132 | } | ||
133 | rsendlist.Add(rsend); | ||
134 | |||
135 | return rsend.send; | ||
136 | } | 61 | } |
137 | 62 | ||
138 | public int UserLevel(UUID agentID) | 63 | public int UserLevel(UUID agentID) |
@@ -144,28 +69,5 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
144 | 69 | ||
145 | return level; | 70 | return level; |
146 | } | 71 | } |
147 | |||
148 | protected virtual ScenePresence WaitGetScenePresence(UUID agentID) | ||
149 | { | ||
150 | int ntimes = 20; | ||
151 | ScenePresence sp = null; | ||
152 | while ((sp = m_scene.GetScenePresence(agentID)) == null && (ntimes-- > 0)) | ||
153 | Thread.Sleep(1000); | ||
154 | |||
155 | if (sp == null) | ||
156 | m_log.WarnFormat( | ||
157 | "[XXX]: Did not find presence with id {0} in {1} before timeout", | ||
158 | agentID, m_scene.RegionInfo.RegionName); | ||
159 | else | ||
160 | { | ||
161 | ntimes = 10; | ||
162 | while (sp.IsInTransit && (ntimes-- > 0)) | ||
163 | Thread.Sleep(1000); | ||
164 | } | ||
165 | |||
166 | return sp; | ||
167 | } | ||
168 | |||
169 | } | 72 | } |
170 | |||
171 | } | 73 | } |
diff --git a/OpenSim/Region/OptionalModules/ViewerSupport/SpecialUIModule.cs b/OpenSim/Region/OptionalModules/ViewerSupport/SpecialUIModule.cs index 3fe922d..fa8fc66 100644 --- a/OpenSim/Region/OptionalModules/ViewerSupport/SpecialUIModule.cs +++ b/OpenSim/Region/OptionalModules/ViewerSupport/SpecialUIModule.cs | |||
@@ -102,8 +102,7 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
102 | { | 102 | { |
103 | if (m_Enabled) | 103 | if (m_Enabled) |
104 | { | 104 | { |
105 | IEntityTransferModule et = m_scene.RequestModuleInterface<IEntityTransferModule>(); | 105 | m_Helper = new SimulatorFeaturesHelper(scene); |
106 | m_Helper = new SimulatorFeaturesHelper(scene, et); | ||
107 | 106 | ||
108 | ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface<ISimulatorFeaturesModule>(); | 107 | ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface<ISimulatorFeaturesModule>(); |
109 | if (featuresModule != null) | 108 | if (featuresModule != null) |
@@ -118,7 +117,7 @@ namespace OpenSim.Region.OptionalModules.ViewerSupport | |||
118 | private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) | 117 | private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features) |
119 | { | 118 | { |
120 | m_log.DebugFormat("[SPECIAL UI]: OnSimulatorFeaturesRequest in {0}", m_scene.RegionInfo.RegionName); | 119 | m_log.DebugFormat("[SPECIAL UI]: OnSimulatorFeaturesRequest in {0}", m_scene.RegionInfo.RegionName); |
121 | if (m_Helper.ShouldSend(agentID) && m_Helper.UserLevel(agentID) <= m_UserLevel) | 120 | if (m_Helper.UserLevel(agentID) <= m_UserLevel) |
122 | { | 121 | { |
123 | OSDMap extrasMap; | 122 | OSDMap extrasMap; |
124 | OSDMap specialUI = new OSDMap(); | 123 | OSDMap specialUI = new OSDMap(); |