diff options
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandPlugins/XmlRequest.cs | 63 |
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 | } |