aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorCharles Krinke2008-05-29 13:42:29 +0000
committerCharles Krinke2008-05-29 13:42:29 +0000
commit91b75eda85d565f4fe4cf7ee844e24d54ef084b6 (patch)
treea46fe007f2a6e061dd165a12f1774853f79e24c7
parent* Added a child agent check to the ChildAgentData Update to make sure that yo... (diff)
downloadopensim-SC_OLD-91b75eda85d565f4fe4cf7ee844e24d54ef084b6.zip
opensim-SC_OLD-91b75eda85d565f4fe4cf7ee844e24d54ef084b6.tar.gz
opensim-SC_OLD-91b75eda85d565f4fe4cf7ee844e24d54ef084b6.tar.bz2
opensim-SC_OLD-91b75eda85d565f4fe4cf7ee844e24d54ef084b6.tar.xz
Mantis#852. Thank you kindly, cmickeyb for a patch that:
There appears to be a problem with the mapping of scripts when an llHTTPRequest completes. CheckHttpRequests() looks for a function that maps to the localID associated with the http request. However, the only context in which it looks is that of the first region. That is, m_CmdManager.m_ScriptEngine.m_ScriptManager is the same no matter where the script executed that initiated the llHTTPRequest. Since scripts appear to be loaded into a region specific scriptmanager on startup, the event handler is only found for requests coming from the first region.
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs63
1 files changed, 46 insertions, 17 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs
index b3e5f3e..c793add 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs
@@ -46,16 +46,23 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugin
46 return; 46 return;
47 47
48 IXMLRPC xmlrpc = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 48 IXMLRPC xmlrpc = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
49 if (null == xmlrpc)
50 return;
51
52 // Process the completed request queue
53 RPCRequestInfo rInfo = xmlrpc.GetNextCompletedRequest();
49 54
50 if (xmlrpc != null) 55 while (rInfo != null)
51 { 56 {
52 RPCRequestInfo rInfo = xmlrpc.GetNextCompletedRequest(); 57 bool handled = false;
53 58
54 while (rInfo != null) 59 // Request must be taken out of the queue in case there is no handler, otherwise we loop infinitely
55 { 60 xmlrpc.RemoveCompletedRequest(rInfo.GetMessageID());
56 if (m_CmdManager.m_ScriptEngine.m_ScriptManager.GetScript(rInfo.GetLocalID(), rInfo.GetItemID()) != null) 61
57 { 62 // And since the xmlrpc request queue is actually shared among all regions on the simulator, we need
58 xmlrpc.RemoveCompletedRequest(rInfo.GetMessageID()); 63 // to look in each one for the appropriate handler
64 foreach (ScriptEngine sman in ScriptEngine.ScriptEngines) {
65 if (sman.m_ScriptManager.GetScript(rInfo.GetLocalID(),rInfo.GetItemID()) != null) {
59 66
60 //Deliver data to prim's remote_data handler 67 //Deliver data to prim's remote_data handler
61 object[] resobj = new object[] 68 object[] resobj = new object[]
@@ -64,21 +71,36 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugin
64 new LSL_Types.LSLInteger(rInfo.GetIntValue()), 71 new LSL_Types.LSLInteger(rInfo.GetIntValue()),
65 new LSL_Types.LSLString(rInfo.GetStrVal()) 72 new LSL_Types.LSLString(rInfo.GetStrVal())
66 }; 73 };
67 m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( 74 sman.m_EventQueueManager.AddToScriptQueue(
68 rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", EventQueueManager.llDetectNull, resobj 75 rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", EventQueueManager.llDetectNull, resobj
69 ); 76 );
77
78 handled = true;
70 } 79 }
80 }
71 81
72 rInfo = xmlrpc.GetNextCompletedRequest(); 82 if (! handled)
83 {
84 Console.WriteLine("Unhandled xml_request: " + rInfo.GetItemID());
73 } 85 }
74 86
75 SendRemoteDataRequest srdInfo = xmlrpc.GetNextCompletedSRDRequest(); 87 rInfo = xmlrpc.GetNextCompletedRequest();
88 }
89
90 // Process the send queue
91 SendRemoteDataRequest srdInfo = xmlrpc.GetNextCompletedSRDRequest();
92
93 while (srdInfo != null)
94 {
95 bool handled = false;
76 96
77 while (srdInfo != null) 97 // Request must be taken out of the queue in case there is no handler, otherwise we loop infinitely
98 xmlrpc.RemoveCompletedSRDRequest(srdInfo.GetReqID());
99
100 // And this is another shared queue... so we check each of the script engines for a handler
101 foreach (ScriptEngine sman in ScriptEngine.ScriptEngines)
78 { 102 {
79 if (m_CmdManager.m_ScriptEngine.m_ScriptManager.GetScript(srdInfo.m_localID, srdInfo.m_itemID) != null) 103 if (sman.m_ScriptManager.GetScript(srdInfo.m_localID,srdInfo.m_itemID) != null) {
80 {
81 xmlrpc.RemoveCompletedSRDRequest(srdInfo.GetReqID());
82 104
83 //Deliver data to prim's remote_data handler 105 //Deliver data to prim's remote_data handler
84 object[] resobj = new object[] 106 object[] resobj = new object[]
@@ -87,13 +109,20 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugin
87 new LSL_Types.LSLInteger(srdInfo.idata), 109 new LSL_Types.LSLInteger(srdInfo.idata),
88 new LSL_Types.LSLString(srdInfo.sdata) 110 new LSL_Types.LSLString(srdInfo.sdata)
89 }; 111 };
90 m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( 112 sman.m_EventQueueManager.AddToScriptQueue(
91 srdInfo.m_localID, srdInfo.m_itemID, "remote_data", EventQueueManager.llDetectNull, resobj 113 srdInfo.m_localID, srdInfo.m_itemID, "remote_data", EventQueueManager.llDetectNull, resobj
92 ); 114 );
93 }
94 115
95 srdInfo = xmlrpc.GetNextCompletedSRDRequest(); 116 handled = true;
117 }
118 }
119
120 if (! handled)
121 {
122 Console.WriteLine("Unhandled xml_srdrequest: " + srdInfo.GetReqID());
96 } 123 }
124
125 srdInfo = xmlrpc.GetNextCompletedSRDRequest();
97 } 126 }
98 } 127 }
99 } 128 }