diff options
-rw-r--r-- | OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs | 6 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs | 47 |
2 files changed, 40 insertions, 13 deletions
diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index b3a4d61..86e7aa0 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs | |||
@@ -68,7 +68,7 @@ namespace OpenSim.Capabilities.Handlers | |||
68 | ret["content_type"] = "text/plain"; | 68 | ret["content_type"] = "text/plain"; |
69 | ret["keepalive"] = false; | 69 | ret["keepalive"] = false; |
70 | ret["reusecontext"] = false; | 70 | ret["reusecontext"] = false; |
71 | 71 | ret["int_bytes"] = 0; | |
72 | string textureStr = (string)request["texture_id"]; | 72 | string textureStr = (string)request["texture_id"]; |
73 | string format = (string)request["format"]; | 73 | string format = (string)request["format"]; |
74 | 74 | ||
@@ -223,6 +223,7 @@ namespace OpenSim.Capabilities.Handlers | |||
223 | { | 223 | { |
224 | response["int_response_code"] = (int)System.Net.HttpStatusCode.OK; | 224 | response["int_response_code"] = (int)System.Net.HttpStatusCode.OK; |
225 | response["bin_response_data"] = texture.Data; | 225 | response["bin_response_data"] = texture.Data; |
226 | response["int_bytes"] = texture.Data.Length; | ||
226 | } | 227 | } |
227 | else | 228 | else |
228 | { | 229 | { |
@@ -232,6 +233,7 @@ namespace OpenSim.Capabilities.Handlers | |||
232 | byte[] d = new byte[len]; | 233 | byte[] d = new byte[len]; |
233 | Array.Copy(texture.Data, start, d, 0, len); | 234 | Array.Copy(texture.Data, start, d, 0, len); |
234 | response["bin_response_data"] = d; | 235 | response["bin_response_data"] = d; |
236 | response["int_bytes"] = len; | ||
235 | } | 237 | } |
236 | // response.Body.Write(texture.Data, start, len); | 238 | // response.Body.Write(texture.Data, start, len); |
237 | } | 239 | } |
@@ -252,6 +254,8 @@ namespace OpenSim.Capabilities.Handlers | |||
252 | response["content_type"] = "image/" + format; | 254 | response["content_type"] = "image/" + format; |
253 | 255 | ||
254 | response["bin_response_data"] = texture.Data; | 256 | response["bin_response_data"] = texture.Data; |
257 | response["int_bytes"] = texture.Data.Length; | ||
258 | |||
255 | // response.Body.Write(texture.Data, 0, texture.Data.Length); | 259 | // response.Body.Write(texture.Data, 0, texture.Data.Length); |
256 | } | 260 | } |
257 | 261 | ||
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs index 19d4b91..4bfdbff 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs | |||
@@ -61,6 +61,13 @@ namespace OpenSim.Region.ClientStack.Linden | |||
61 | public Hashtable request; | 61 | public Hashtable request; |
62 | } | 62 | } |
63 | 63 | ||
64 | public struct aPollResponse | ||
65 | { | ||
66 | public Hashtable response; | ||
67 | public int bytes; | ||
68 | } | ||
69 | |||
70 | |||
64 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 71 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
65 | 72 | ||
66 | private Scene m_scene; | 73 | private Scene m_scene; |
@@ -75,6 +82,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
75 | private static OpenMetaverse.BlockingQueue<aPollRequest> m_queue = | 82 | private static OpenMetaverse.BlockingQueue<aPollRequest> m_queue = |
76 | new OpenMetaverse.BlockingQueue<aPollRequest>(); | 83 | new OpenMetaverse.BlockingQueue<aPollRequest>(); |
77 | 84 | ||
85 | private Dictionary<UUID,PollServiceTextureEventArgs> m_pollservices = new Dictionary<UUID,PollServiceTextureEventArgs>(); | ||
86 | |||
78 | #region ISharedRegionModule Members | 87 | #region ISharedRegionModule Members |
79 | 88 | ||
80 | public void Initialise(IConfigSource source) | 89 | public void Initialise(IConfigSource source) |
@@ -147,7 +156,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
147 | // int wind = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | 156 | // int wind = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; |
148 | // int cloud = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | 157 | // int cloud = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; |
149 | // int task = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | 158 | // int task = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; |
150 | pos = pos + 16; | 159 | pos = pos + 20; |
151 | int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; | 160 | int texture = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); pos += 4; |
152 | //int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); | 161 | //int asset = (int)(BitConverter.ToSingle(adjData, pos) * 0.125f); |
153 | return texture; | 162 | return texture; |
@@ -159,6 +168,11 @@ namespace OpenSim.Region.ClientStack.Linden | |||
159 | byte[] throttles = p.ControllingClient.GetThrottlesPacked(1); | 168 | byte[] throttles = p.ControllingClient.GetThrottlesPacked(1); |
160 | UUID user = p.UUID; | 169 | UUID user = p.UUID; |
161 | int imagethrottle = ExtractImageThrottle(throttles); | 170 | int imagethrottle = ExtractImageThrottle(throttles); |
171 | PollServiceTextureEventArgs args; | ||
172 | if (m_pollservices.TryGetValue(user,out args)) | ||
173 | { | ||
174 | args.UpdateThrottle(imagethrottle); | ||
175 | } | ||
162 | } | 176 | } |
163 | 177 | ||
164 | public void PostInitialise() | 178 | public void PostInitialise() |
@@ -187,8 +201,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
187 | { | 201 | { |
188 | private List<Hashtable> requests = | 202 | private List<Hashtable> requests = |
189 | new List<Hashtable>(); | 203 | new List<Hashtable>(); |
190 | private Dictionary<UUID, Hashtable> responses = | 204 | private Dictionary<UUID, aPollResponse> responses = |
191 | new Dictionary<UUID, Hashtable>(); | 205 | new Dictionary<UUID, aPollResponse>(); |
192 | 206 | ||
193 | private Scene m_scene; | 207 | private Scene m_scene; |
194 | 208 | ||
@@ -196,7 +210,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
196 | base(null, null, null, null, pId, int.MaxValue) | 210 | base(null, null, null, null, pId, int.MaxValue) |
197 | { | 211 | { |
198 | m_scene = scene; | 212 | m_scene = scene; |
199 | 213 | // x is request id, y is userid | |
200 | HasEvents = (x, y) => | 214 | HasEvents = (x, y) => |
201 | { | 215 | { |
202 | lock (responses) | 216 | lock (responses) |
@@ -208,7 +222,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
208 | { | 222 | { |
209 | try | 223 | try |
210 | { | 224 | { |
211 | return responses[x]; | 225 | return responses[x].response; |
212 | } | 226 | } |
213 | finally | 227 | finally |
214 | { | 228 | { |
@@ -216,14 +230,14 @@ namespace OpenSim.Region.ClientStack.Linden | |||
216 | } | 230 | } |
217 | } | 231 | } |
218 | }; | 232 | }; |
219 | 233 | // x is request id, y is request data hashtable | |
220 | Request = (x, y) => | 234 | Request = (x, y) => |
221 | { | 235 | { |
222 | aPollRequest reqinfo = new aPollRequest(); | 236 | aPollRequest reqinfo = new aPollRequest(); |
223 | reqinfo.thepoll = this; | 237 | reqinfo.thepoll = this; |
224 | reqinfo.reqID = x; | 238 | reqinfo.reqID = x; |
225 | reqinfo.request = y; | 239 | reqinfo.request = y; |
226 | 240 | ||
227 | m_queue.Enqueue(reqinfo); | 241 | m_queue.Enqueue(reqinfo); |
228 | }; | 242 | }; |
229 | 243 | ||
@@ -265,16 +279,21 @@ namespace OpenSim.Region.ClientStack.Linden | |||
265 | response["content_type"] = "text/plain"; | 279 | response["content_type"] = "text/plain"; |
266 | response["keepalive"] = false; | 280 | response["keepalive"] = false; |
267 | response["reusecontext"] = false; | 281 | response["reusecontext"] = false; |
268 | 282 | ||
269 | lock (responses) | 283 | lock (responses) |
270 | responses[requestID] = response; | 284 | responses[requestID] = new aPollResponse() {bytes = 0,response = response}; |
271 | 285 | ||
272 | return; | 286 | return; |
273 | } | 287 | } |
274 | 288 | ||
275 | response = m_getTextureHandler.Handle(requestinfo.request); | 289 | response = m_getTextureHandler.Handle(requestinfo.request); |
276 | lock (responses) | 290 | lock (responses) |
277 | responses[requestID] = response; | 291 | responses[requestID] = new aPollResponse() { bytes = (int)response["int_bytes"], response = response}; |
292 | } | ||
293 | |||
294 | internal void UpdateThrottle(int pimagethrottle) | ||
295 | { | ||
296 | |||
278 | } | 297 | } |
279 | } | 298 | } |
280 | 299 | ||
@@ -299,19 +318,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
299 | protocol = "https"; | 318 | protocol = "https"; |
300 | } | 319 | } |
301 | caps.RegisterHandler("GetTexture", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); | 320 | caps.RegisterHandler("GetTexture", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); |
302 | 321 | m_pollservices.Add(agentID, args); | |
303 | m_capsDict[agentID] = capUrl; | 322 | m_capsDict[agentID] = capUrl; |
304 | } | 323 | } |
305 | 324 | ||
306 | private void DeregisterCaps(UUID agentID, Caps caps) | 325 | private void DeregisterCaps(UUID agentID, Caps caps) |
307 | { | 326 | { |
308 | string capUrl; | 327 | string capUrl; |
309 | 328 | PollServiceTextureEventArgs args; | |
310 | if (m_capsDict.TryGetValue(agentID, out capUrl)) | 329 | if (m_capsDict.TryGetValue(agentID, out capUrl)) |
311 | { | 330 | { |
312 | MainServer.Instance.RemoveHTTPHandler("", capUrl); | 331 | MainServer.Instance.RemoveHTTPHandler("", capUrl); |
313 | m_capsDict.Remove(agentID); | 332 | m_capsDict.Remove(agentID); |
314 | } | 333 | } |
334 | if (m_pollservices.TryGetValue(agentID, out args)) | ||
335 | { | ||
336 | m_pollservices.Remove(agentID); | ||
337 | } | ||
315 | } | 338 | } |
316 | 339 | ||
317 | private void DoTextureRequests() | 340 | private void DoTextureRequests() |