diff options
author | Sean Dague | 2008-02-19 19:16:21 +0000 |
---|---|---|
committer | Sean Dague | 2008-02-19 19:16:21 +0000 |
commit | 530cc2488461a4ef68a06eaba42698fcdc09f459 (patch) | |
tree | d2db34a2dcdb10b3b85aaeb200334ee9a27cae91 /OpenSim/Region/ScriptEngine/Common/ScriptEngineBase | |
parent | Added to OpenSim.ini.example: (diff) | |
download | opensim-SC-530cc2488461a4ef68a06eaba42698fcdc09f459.zip opensim-SC-530cc2488461a4ef68a06eaba42698fcdc09f459.tar.gz opensim-SC-530cc2488461a4ef68a06eaba42698fcdc09f459.tar.bz2 opensim-SC-530cc2488461a4ef68a06eaba42698fcdc09f459.tar.xz |
From: Michael Osias <mosias@us.ibm.com>
This patch implements the llSendRemoteData command and fixes mantis 552,
and possibly 586.
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Common/ScriptEngineBase')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs | 104 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs | 56 |
2 files changed, 112 insertions, 48 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs index 1afe71c..0491612 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs | |||
@@ -125,8 +125,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
125 | comms.DeleteListener(itemID); | 125 | comms.DeleteListener(itemID); |
126 | 126 | ||
127 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 127 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
128 | xmlrpc.DeleteChannel(itemID); | 128 | xmlrpc.DeleteChannels(itemID); |
129 | 129 | ||
130 | xmlrpc.CancelSRDRequests(itemID); | ||
131 | |||
130 | } | 132 | } |
131 | 133 | ||
132 | #region TIMER | 134 | #region TIMER |
@@ -238,24 +240,29 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
238 | // implemented here yet anyway. Should be fixed if/when maxsize | 240 | // implemented here yet anyway. Should be fixed if/when maxsize |
239 | // is supported | 241 | // is supported |
240 | 242 | ||
241 | object[] resobj = new object[] | 243 | if (m_ScriptEngine.m_ScriptManager.GetScript(httpInfo.localID, httpInfo.itemID) != null) |
244 | { | ||
245 | iHttpReq.RemoveCompletedRequest(httpInfo.reqID); | ||
246 | object[] resobj = new object[] | ||
242 | { | 247 | { |
243 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body | 248 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body |
244 | }; | 249 | }; |
245 | 250 | ||
246 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 251 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
247 | httpInfo.localID, httpInfo.itemID, "http_response", EventQueueManager.llDetectNull, resobj | 252 | httpInfo.localID, httpInfo.itemID, "http_response", EventQueueManager.llDetectNull, resobj |
248 | ); | 253 | ); |
249 | 254 | ||
250 | httpInfo.Stop(); | 255 | } |
251 | httpInfo = null; | ||
252 | 256 | ||
253 | httpInfo = iHttpReq.GetNextCompletedRequest(); | 257 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
258 | |||
254 | } | 259 | } |
255 | } | 260 | } |
256 | 261 | ||
257 | #endregion | 262 | #endregion |
258 | 263 | ||
264 | #region Check llRemoteData channels | ||
265 | |||
259 | public void CheckXMLRPCRequests() | 266 | public void CheckXMLRPCRequests() |
260 | { | 267 | { |
261 | if (m_ScriptEngine.World == null) | 268 | if (m_ScriptEngine.World == null) |
@@ -265,47 +272,96 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
265 | 272 | ||
266 | if (xmlrpc != null) | 273 | if (xmlrpc != null) |
267 | { | 274 | { |
268 | while (xmlrpc.hasRequests()) | 275 | RPCRequestInfo rInfo = xmlrpc.GetNextCompletedRequest(); |
276 | |||
277 | while (rInfo != null) | ||
269 | { | 278 | { |
270 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | 279 | if (m_ScriptEngine.m_ScriptManager.GetScript(rInfo.GetLocalID(), rInfo.GetItemID()) != null) |
271 | //Console.WriteLine("PICKED REQUEST"); | 280 | { |
281 | xmlrpc.RemoveCompletedRequest(rInfo.GetMessageID()); | ||
272 | 282 | ||
273 | //Deliver data to prim's remote_data handler | 283 | //Deliver data to prim's remote_data handler |
274 | object[] resobj = new object[] | 284 | object[] resobj = new object[] |
275 | { | 285 | { |
276 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), String.Empty, | 286 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), String.Empty, |
277 | rInfo.GetIntValue(), | 287 | rInfo.GetIntValue(), |
278 | rInfo.GetStrVal() | 288 | rInfo.GetStrVal() |
279 | }; | 289 | }; |
280 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 290 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
281 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", EventQueueManager.llDetectNull, resobj | 291 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", EventQueueManager.llDetectNull, resobj |
282 | ); | 292 | ); |
293 | |||
294 | } | ||
295 | |||
296 | rInfo = xmlrpc.GetNextCompletedRequest(); | ||
297 | |||
283 | } | 298 | } |
299 | |||
300 | SendRemoteDataRequest srdInfo = xmlrpc.GetNextCompletedSRDRequest(); | ||
301 | |||
302 | while (srdInfo != null) | ||
303 | { | ||
304 | if (m_ScriptEngine.m_ScriptManager.GetScript(srdInfo.m_localID, srdInfo.m_itemID) != null) | ||
305 | { | ||
306 | xmlrpc.RemoveCompletedSRDRequest(srdInfo.GetReqID()); | ||
307 | |||
308 | //Deliver data to prim's remote_data handler | ||
309 | object[] resobj = new object[] | ||
310 | { | ||
311 | 3, srdInfo.channel.ToString(), srdInfo.GetReqID().ToString(), String.Empty, | ||
312 | srdInfo.idata, | ||
313 | srdInfo.sdata | ||
314 | }; | ||
315 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
316 | srdInfo.m_localID, srdInfo.m_itemID, "remote_data", EventQueueManager.llDetectNull, resobj | ||
317 | ); | ||
318 | |||
319 | } | ||
320 | |||
321 | srdInfo = xmlrpc.GetNextCompletedSRDRequest(); | ||
322 | |||
323 | } | ||
324 | |||
325 | |||
284 | } | 326 | } |
285 | } | 327 | } |
286 | 328 | ||
329 | #endregion | ||
330 | |||
331 | #region Check llListeners | ||
332 | |||
287 | public void CheckListeners() | 333 | public void CheckListeners() |
288 | { | 334 | { |
289 | if (m_ScriptEngine.World == null) | 335 | if (m_ScriptEngine.World == null) |
290 | return; | 336 | return; |
291 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 337 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
292 | 338 | ||
293 | while (comms.HasMessages()) | 339 | if (comms != null) |
294 | { | 340 | { |
295 | ListenerInfo lInfo = comms.GetNextMessage(); | 341 | while (comms.HasMessages()) |
296 | 342 | { | |
297 | //Deliver data to prim's listen handler | 343 | if (m_ScriptEngine.m_ScriptManager.GetScript( |
298 | object[] resobj = new object[] | 344 | comms.PeekNextMessageLocalID(), comms.PeekNextMessageItemID()) != null) |
299 | { | 345 | { |
300 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | 346 | ListenerInfo lInfo = comms.GetNextMessage(); |
301 | }; | ||
302 | 347 | ||
303 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 348 | //Deliver data to prim's listen handler |
304 | lInfo.GetLocalID(), lInfo.GetItemID(), "listen", EventQueueManager.llDetectNull, resobj | 349 | object[] resobj = new object[] |
305 | ); | 350 | { |
351 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | ||
352 | }; | ||
353 | |||
354 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
355 | lInfo.GetLocalID(), lInfo.GetItemID(), "listen", EventQueueManager.llDetectNull, resobj | ||
356 | ); | ||
357 | } | ||
358 | |||
359 | } | ||
306 | } | 360 | } |
307 | } | 361 | } |
308 | 362 | ||
363 | #endregion | ||
364 | |||
309 | /// <summary> | 365 | /// <summary> |
310 | /// If set to true then threads and stuff should try to make a graceful exit | 366 | /// If set to true then threads and stuff should try to make a graceful exit |
311 | /// </summary> | 367 | /// </summary> |
@@ -317,4 +373,4 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
317 | private bool _PleaseShutdown = false; | 373 | private bool _PleaseShutdown = false; |
318 | 374 | ||
319 | } | 375 | } |
320 | } \ No newline at end of file | 376 | } |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs index 641453e..d47cab8 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs | |||
@@ -67,6 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
67 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); | 67 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); |
68 | private static bool PrivateThread; | 68 | private static bool PrivateThread; |
69 | private int LoadUnloadMaxQueueSize; | 69 | private int LoadUnloadMaxQueueSize; |
70 | private Object scriptLock = new Object(); | ||
70 | 71 | ||
71 | // Load/Unload structure | 72 | // Load/Unload structure |
72 | private struct LUStruct | 73 | private struct LUStruct |
@@ -304,7 +305,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
304 | //ScriptBaseInterface Script = (ScriptBaseInterface)GetScript(localID, itemID); | 305 | //ScriptBaseInterface Script = (ScriptBaseInterface)GetScript(localID, itemID); |
305 | IScript Script = GetScript(localID, itemID); | 306 | IScript Script = GetScript(localID, itemID); |
306 | if (Script == null) | 307 | if (Script == null) |
308 | { | ||
307 | return; | 309 | return; |
310 | } | ||
308 | //cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined | 311 | //cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined |
309 | ///#if DEBUG | 312 | ///#if DEBUG |
310 | /// Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); | 313 | /// Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); |
@@ -331,37 +334,42 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
331 | 334 | ||
332 | public IScript GetScript(uint localID, LLUUID itemID) | 335 | public IScript GetScript(uint localID, LLUUID itemID) |
333 | { | 336 | { |
334 | if (Scripts.ContainsKey(localID) == false) | 337 | lock (scriptLock) |
335 | return null; | 338 | { |
336 | 339 | if (Scripts.ContainsKey(localID) == false) | |
337 | Dictionary<LLUUID, IScript> Obj; | 340 | return null; |
338 | Scripts.TryGetValue(localID, out Obj); | 341 | |
339 | if (Obj.ContainsKey(itemID) == false) | 342 | Dictionary<LLUUID, IScript> Obj; |
340 | return null; | 343 | Scripts.TryGetValue(localID, out Obj); |
341 | 344 | if (Obj.ContainsKey(itemID) == false) | |
342 | // Get script | 345 | return null; |
343 | IScript Script; | 346 | |
344 | Obj.TryGetValue(itemID, out Script); | 347 | // Get script |
345 | 348 | IScript Script; | |
346 | return Script; | 349 | Obj.TryGetValue(itemID, out Script); |
350 | return Script; | ||
351 | } | ||
347 | } | 352 | } |
348 | 353 | ||
349 | public void SetScript(uint localID, LLUUID itemID, IScript Script) | 354 | public void SetScript(uint localID, LLUUID itemID, IScript Script) |
350 | { | 355 | { |
351 | // Create object if it doesn't exist | 356 | lock (scriptLock) |
352 | if (Scripts.ContainsKey(localID) == false) | ||
353 | { | 357 | { |
354 | Scripts.Add(localID, new Dictionary<LLUUID, IScript>()); | 358 | // Create object if it doesn't exist |
355 | } | 359 | if (Scripts.ContainsKey(localID) == false) |
360 | { | ||
361 | Scripts.Add(localID, new Dictionary<LLUUID, IScript>()); | ||
362 | } | ||
356 | 363 | ||
357 | // Delete script if it exists | 364 | // Delete script if it exists |
358 | Dictionary<LLUUID, IScript> Obj; | 365 | Dictionary<LLUUID, IScript> Obj; |
359 | Scripts.TryGetValue(localID, out Obj); | 366 | Scripts.TryGetValue(localID, out Obj); |
360 | if (Obj.ContainsKey(itemID) == true) | 367 | if (Obj.ContainsKey(itemID) == true) |
361 | Obj.Remove(itemID); | 368 | Obj.Remove(itemID); |
362 | 369 | ||
363 | // Add to object | 370 | // Add to object |
364 | Obj.Add(itemID, Script); | 371 | Obj.Add(itemID, Script); |
372 | } | ||
365 | } | 373 | } |
366 | 374 | ||
367 | public void RemoveScript(uint localID, LLUUID itemID) | 375 | public void RemoveScript(uint localID, LLUUID itemID) |