diff options
Diffstat (limited to 'OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs')
-rw-r--r-- | OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs | 514 |
1 files changed, 0 insertions, 514 deletions
diff --git a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs b/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs deleted file mode 100644 index 3384952..0000000 --- a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs +++ /dev/null | |||
@@ -1,514 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Collections; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Net; | ||
31 | using System.Reflection; | ||
32 | using System.Threading; | ||
33 | using log4net; | ||
34 | using Nwc.XmlRpc; | ||
35 | using OpenMetaverse; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Framework.Servers; | ||
38 | using OpenSim.Framework.Servers.HttpServer; | ||
39 | using OpenSim.Grid.Framework; | ||
40 | |||
41 | namespace OpenSim.Grid.UserServer.Modules | ||
42 | { | ||
43 | public enum NotificationRequest : int | ||
44 | { | ||
45 | Login = 0, | ||
46 | Logout = 1, | ||
47 | Shutdown = 2 | ||
48 | } | ||
49 | |||
50 | public struct PresenceNotification | ||
51 | { | ||
52 | public NotificationRequest request; | ||
53 | public UUID agentID; | ||
54 | public UUID sessionID; | ||
55 | public UUID RegionID; | ||
56 | public ulong regionhandle; | ||
57 | public float positionX; | ||
58 | public float positionY; | ||
59 | public float positionZ; | ||
60 | public string firstname; | ||
61 | public string lastname; | ||
62 | } | ||
63 | |||
64 | public delegate void AgentLocationDelegate(UUID agentID, UUID regionID, ulong regionHandle); | ||
65 | public delegate void AgentLeavingDelegate(UUID agentID, UUID regionID, ulong regionHandle); | ||
66 | public delegate void RegionStartupDelegate(UUID regionID); | ||
67 | public delegate void RegionShutdownDelegate(UUID regionID); | ||
68 | |||
69 | |||
70 | public class MessageServersConnector | ||
71 | { | ||
72 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
73 | |||
74 | public Dictionary<string, MessageServerInfo> MessageServers; | ||
75 | |||
76 | private BaseHttpServer m_httpServer; | ||
77 | |||
78 | private OpenSim.Framework.BlockingQueue<PresenceNotification> m_NotifyQueue = | ||
79 | new OpenSim.Framework.BlockingQueue<PresenceNotification>(); | ||
80 | |||
81 | private IGridServiceCore m_core; | ||
82 | |||
83 | public event AgentLocationDelegate OnAgentLocation; | ||
84 | public event AgentLeavingDelegate OnAgentLeaving; | ||
85 | public event RegionStartupDelegate OnRegionStartup; | ||
86 | public event RegionShutdownDelegate OnRegionShutdown; | ||
87 | |||
88 | public MessageServersConnector() | ||
89 | { | ||
90 | MessageServers = new Dictionary<string, MessageServerInfo>(); | ||
91 | } | ||
92 | |||
93 | public void Initialise(IGridServiceCore core) | ||
94 | { | ||
95 | m_core = core; | ||
96 | m_core.RegisterInterface<MessageServersConnector>(this); | ||
97 | |||
98 | Watchdog.StartThread(NotifyQueueRunner, "NotifyQueueRunner", ThreadPriority.Normal, true); | ||
99 | } | ||
100 | |||
101 | public void PostInitialise() | ||
102 | { | ||
103 | } | ||
104 | |||
105 | public void RegisterHandlers(BaseHttpServer httpServer) | ||
106 | { | ||
107 | m_httpServer = httpServer; | ||
108 | |||
109 | m_httpServer.AddXmlRPCHandler("region_startup", RegionStartup); | ||
110 | m_httpServer.AddXmlRPCHandler("region_shutdown", RegionShutdown); | ||
111 | m_httpServer.AddXmlRPCHandler("agent_location", AgentLocation); | ||
112 | m_httpServer.AddXmlRPCHandler("agent_leaving", AgentLeaving); | ||
113 | // Message Server ---> User Server | ||
114 | m_httpServer.AddXmlRPCHandler("register_messageserver", XmlRPCRegisterMessageServer); | ||
115 | m_httpServer.AddXmlRPCHandler("agent_change_region", XmlRPCUserMovedtoRegion); | ||
116 | m_httpServer.AddXmlRPCHandler("deregister_messageserver", XmlRPCDeRegisterMessageServer); | ||
117 | } | ||
118 | |||
119 | public void RegisterMessageServer(string URI, MessageServerInfo serverData) | ||
120 | { | ||
121 | lock (MessageServers) | ||
122 | { | ||
123 | if (!MessageServers.ContainsKey(URI)) | ||
124 | MessageServers.Add(URI, serverData); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | public void DeRegisterMessageServer(string URI) | ||
129 | { | ||
130 | lock (MessageServers) | ||
131 | { | ||
132 | if (MessageServers.ContainsKey(URI)) | ||
133 | MessageServers.Remove(URI); | ||
134 | } | ||
135 | } | ||
136 | |||
137 | public void AddResponsibleRegion(string URI, ulong regionhandle) | ||
138 | { | ||
139 | if (!MessageServers.ContainsKey(URI)) | ||
140 | { | ||
141 | m_log.Warn("[MSGSERVER]: Got addResponsibleRegion Request for a MessageServer that isn't registered"); | ||
142 | } | ||
143 | else | ||
144 | { | ||
145 | MessageServerInfo msginfo = MessageServers["URI"]; | ||
146 | msginfo.responsibleForRegions.Add(regionhandle); | ||
147 | MessageServers["URI"] = msginfo; | ||
148 | } | ||
149 | } | ||
150 | public void RemoveResponsibleRegion(string URI, ulong regionhandle) | ||
151 | { | ||
152 | if (!MessageServers.ContainsKey(URI)) | ||
153 | { | ||
154 | m_log.Warn("[MSGSERVER]: Got RemoveResponsibleRegion Request for a MessageServer that isn't registered"); | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | MessageServerInfo msginfo = MessageServers["URI"]; | ||
159 | if (msginfo.responsibleForRegions.Contains(regionhandle)) | ||
160 | { | ||
161 | msginfo.responsibleForRegions.Remove(regionhandle); | ||
162 | MessageServers["URI"] = msginfo; | ||
163 | } | ||
164 | } | ||
165 | |||
166 | } | ||
167 | public XmlRpcResponse XmlRPCRegisterMessageServer(XmlRpcRequest request, IPEndPoint remoteClient) | ||
168 | { | ||
169 | XmlRpcResponse response = new XmlRpcResponse(); | ||
170 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
171 | Hashtable responseData = new Hashtable(); | ||
172 | |||
173 | if (requestData.Contains("uri")) | ||
174 | { | ||
175 | string URI = (string)requestData["uri"]; | ||
176 | string sendkey=(string)requestData["sendkey"]; | ||
177 | string recvkey=(string)requestData["recvkey"]; | ||
178 | MessageServerInfo m = new MessageServerInfo(); | ||
179 | m.URI = URI; | ||
180 | m.sendkey = sendkey; | ||
181 | m.recvkey = recvkey; | ||
182 | RegisterMessageServer(URI, m); | ||
183 | responseData["responsestring"] = "TRUE"; | ||
184 | response.Value = responseData; | ||
185 | } | ||
186 | return response; | ||
187 | } | ||
188 | public XmlRpcResponse XmlRPCDeRegisterMessageServer(XmlRpcRequest request, IPEndPoint remoteClient) | ||
189 | { | ||
190 | XmlRpcResponse response = new XmlRpcResponse(); | ||
191 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
192 | Hashtable responseData = new Hashtable(); | ||
193 | |||
194 | if (requestData.Contains("uri")) | ||
195 | { | ||
196 | string URI = (string)requestData["uri"]; | ||
197 | |||
198 | DeRegisterMessageServer(URI); | ||
199 | responseData["responsestring"] = "TRUE"; | ||
200 | response.Value = responseData; | ||
201 | } | ||
202 | return response; | ||
203 | } | ||
204 | |||
205 | public XmlRpcResponse XmlRPCUserMovedtoRegion(XmlRpcRequest request, IPEndPoint remoteClient) | ||
206 | { | ||
207 | XmlRpcResponse response = new XmlRpcResponse(); | ||
208 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
209 | Hashtable responseData = new Hashtable(); | ||
210 | |||
211 | if (requestData.Contains("fromuri")) | ||
212 | { | ||
213 | // string sURI = (string)requestData["fromuri"]; | ||
214 | // string sagentID = (string)requestData["agentid"]; | ||
215 | // string ssessionID = (string)requestData["sessionid"]; | ||
216 | // string scurrentRegionID = (string)requestData["regionid"]; | ||
217 | // string sregionhandle = (string)requestData["regionhandle"]; | ||
218 | // string scurrentpos = (string)requestData["currentpos"]; | ||
219 | //Vector3.TryParse((string)reader["currentPos"], out retval.currentPos); | ||
220 | // TODO: Okay now raise event so the user server can pass this data to the Usermanager | ||
221 | |||
222 | responseData["responsestring"] = "TRUE"; | ||
223 | response.Value = responseData; | ||
224 | } | ||
225 | return response; | ||
226 | } | ||
227 | |||
228 | public void TellMessageServersAboutUser(UUID agentID, UUID sessionID, UUID RegionID, | ||
229 | ulong regionhandle, float positionX, float positionY, | ||
230 | float positionZ, string firstname, string lastname) | ||
231 | { | ||
232 | PresenceNotification notification = new PresenceNotification(); | ||
233 | |||
234 | notification.request = NotificationRequest.Login; | ||
235 | notification.agentID = agentID; | ||
236 | notification.sessionID = sessionID; | ||
237 | notification.RegionID = RegionID; | ||
238 | notification.regionhandle = regionhandle; | ||
239 | notification.positionX = positionX; | ||
240 | notification.positionY = positionY; | ||
241 | notification.positionZ = positionZ; | ||
242 | notification.firstname = firstname; | ||
243 | notification.lastname = lastname; | ||
244 | |||
245 | m_NotifyQueue.Enqueue(notification); | ||
246 | } | ||
247 | |||
248 | private void TellMessageServersAboutUserInternal(UUID agentID, UUID sessionID, UUID RegionID, | ||
249 | ulong regionhandle, float positionX, float positionY, | ||
250 | float positionZ, string firstname, string lastname) | ||
251 | { | ||
252 | // Loop over registered Message Servers (AND THERE WILL BE MORE THEN ONE :D) | ||
253 | lock (MessageServers) | ||
254 | { | ||
255 | if (MessageServers.Count > 0) | ||
256 | { | ||
257 | m_log.Info("[MSGCONNECTOR]: Sending login notice to registered message servers"); | ||
258 | } | ||
259 | // else | ||
260 | // { | ||
261 | // m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring"); | ||
262 | // } | ||
263 | foreach (MessageServerInfo serv in MessageServers.Values) | ||
264 | { | ||
265 | NotifyMessageServerAboutUser(serv, agentID, sessionID, RegionID, | ||
266 | regionhandle, positionX, positionY, positionZ, | ||
267 | firstname, lastname); | ||
268 | } | ||
269 | } | ||
270 | } | ||
271 | |||
272 | private void TellMessageServersAboutUserLogoffInternal(UUID agentID) | ||
273 | { | ||
274 | lock (MessageServers) | ||
275 | { | ||
276 | if (MessageServers.Count > 0) | ||
277 | { | ||
278 | m_log.Info("[MSGCONNECTOR]: Sending logoff notice to registered message servers"); | ||
279 | } | ||
280 | else | ||
281 | { | ||
282 | // m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring"); | ||
283 | } | ||
284 | foreach (MessageServerInfo serv in MessageServers.Values) | ||
285 | { | ||
286 | NotifyMessageServerAboutUserLogoff(serv,agentID); | ||
287 | } | ||
288 | } | ||
289 | } | ||
290 | |||
291 | private void TellMessageServersAboutRegionShutdownInternal(UUID regionID) | ||
292 | { | ||
293 | lock (MessageServers) | ||
294 | { | ||
295 | if (MessageServers.Count > 0) | ||
296 | { | ||
297 | m_log.Info("[MSGCONNECTOR]: Sending region down notice to registered message servers"); | ||
298 | } | ||
299 | else | ||
300 | { | ||
301 | // m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring"); | ||
302 | } | ||
303 | foreach (MessageServerInfo serv in MessageServers.Values) | ||
304 | { | ||
305 | NotifyMessageServerAboutRegionShutdown(serv,regionID); | ||
306 | } | ||
307 | } | ||
308 | } | ||
309 | |||
310 | public void TellMessageServersAboutUserLogoff(UUID agentID) | ||
311 | { | ||
312 | PresenceNotification notification = new PresenceNotification(); | ||
313 | |||
314 | notification.request = NotificationRequest.Logout; | ||
315 | notification.agentID = agentID; | ||
316 | |||
317 | m_NotifyQueue.Enqueue(notification); | ||
318 | } | ||
319 | |||
320 | public void TellMessageServersAboutRegionShutdown(UUID regionID) | ||
321 | { | ||
322 | PresenceNotification notification = new PresenceNotification(); | ||
323 | |||
324 | notification.request = NotificationRequest.Shutdown; | ||
325 | notification.RegionID = regionID; | ||
326 | |||
327 | m_NotifyQueue.Enqueue(notification); | ||
328 | } | ||
329 | |||
330 | private void NotifyMessageServerAboutUserLogoff(MessageServerInfo serv, UUID agentID) | ||
331 | { | ||
332 | Hashtable reqparams = new Hashtable(); | ||
333 | reqparams["sendkey"] = serv.sendkey; | ||
334 | reqparams["agentid"] = agentID.ToString(); | ||
335 | ArrayList SendParams = new ArrayList(); | ||
336 | SendParams.Add(reqparams); | ||
337 | |||
338 | XmlRpcRequest GridReq = new XmlRpcRequest("logout_of_simulator", SendParams); | ||
339 | try | ||
340 | { | ||
341 | GridReq.Send(serv.URI, 6000); | ||
342 | } | ||
343 | catch (WebException) | ||
344 | { | ||
345 | m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about log out. Other users might still think this user is online"); | ||
346 | } | ||
347 | m_log.Info("[LOGOUT]: Notified : " + serv.URI + " about user logout"); | ||
348 | } | ||
349 | |||
350 | private void NotifyMessageServerAboutRegionShutdown(MessageServerInfo serv, UUID regionID) | ||
351 | { | ||
352 | Hashtable reqparams = new Hashtable(); | ||
353 | reqparams["sendkey"] = serv.sendkey; | ||
354 | reqparams["regionid"] = regionID.ToString(); | ||
355 | ArrayList SendParams = new ArrayList(); | ||
356 | SendParams.Add(reqparams); | ||
357 | |||
358 | XmlRpcRequest GridReq = new XmlRpcRequest("process_region_shutdown", SendParams); | ||
359 | try | ||
360 | { | ||
361 | GridReq.Send(serv.URI, 6000); | ||
362 | } | ||
363 | catch (WebException) | ||
364 | { | ||
365 | m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about region shutdown."); | ||
366 | } | ||
367 | m_log.Info("[REGION UPDOWN]: Notified : " + serv.URI + " about region state change"); | ||
368 | } | ||
369 | |||
370 | private void NotifyMessageServerAboutUser(MessageServerInfo serv, | ||
371 | UUID agentID, UUID sessionID, UUID RegionID, | ||
372 | ulong regionhandle, float positionX, float positionY, float positionZ, | ||
373 | string firstname, string lastname) | ||
374 | { | ||
375 | Hashtable reqparams = new Hashtable(); | ||
376 | reqparams["sendkey"] = serv.sendkey; | ||
377 | reqparams["agentid"] = agentID.ToString(); | ||
378 | reqparams["sessionid"] = sessionID.ToString(); | ||
379 | reqparams["regionid"] = RegionID.ToString(); | ||
380 | reqparams["regionhandle"] = regionhandle.ToString(); | ||
381 | reqparams["positionx"] = positionX.ToString(); | ||
382 | reqparams["positiony"] = positionY.ToString(); | ||
383 | reqparams["positionz"] = positionZ.ToString(); | ||
384 | reqparams["firstname"] = firstname; | ||
385 | reqparams["lastname"] = lastname; | ||
386 | |||
387 | //reqparams["position"] = Position.ToString(); | ||
388 | |||
389 | ArrayList SendParams = new ArrayList(); | ||
390 | SendParams.Add(reqparams); | ||
391 | |||
392 | XmlRpcRequest GridReq = new XmlRpcRequest("login_to_simulator", SendParams); | ||
393 | try | ||
394 | { | ||
395 | GridReq.Send(serv.URI, 6000); | ||
396 | m_log.Info("[LOGIN]: Notified : " + serv.URI + " about user login"); | ||
397 | } | ||
398 | catch (WebException) | ||
399 | { | ||
400 | m_log.Warn("[MSGCONNECTOR]: Unable to notify Message Server about login. Presence might be borked for this user"); | ||
401 | } | ||
402 | |||
403 | } | ||
404 | |||
405 | private void NotifyQueueRunner() | ||
406 | { | ||
407 | while (true) | ||
408 | { | ||
409 | PresenceNotification presence = m_NotifyQueue.Dequeue(); | ||
410 | |||
411 | if (presence.request == NotificationRequest.Shutdown) | ||
412 | { | ||
413 | TellMessageServersAboutRegionShutdownInternal(presence.RegionID); | ||
414 | } | ||
415 | |||
416 | if (presence.request == NotificationRequest.Login) | ||
417 | { | ||
418 | TellMessageServersAboutUserInternal(presence.agentID, | ||
419 | presence.sessionID, presence.RegionID, | ||
420 | presence.regionhandle, presence.positionX, | ||
421 | presence.positionY, presence.positionZ, | ||
422 | presence.firstname, presence.lastname); | ||
423 | } | ||
424 | |||
425 | if (presence.request == NotificationRequest.Logout) | ||
426 | { | ||
427 | TellMessageServersAboutUserLogoffInternal(presence.agentID); | ||
428 | } | ||
429 | |||
430 | Watchdog.UpdateThread(); | ||
431 | } | ||
432 | } | ||
433 | |||
434 | public XmlRpcResponse RegionStartup(XmlRpcRequest request, IPEndPoint remoteClient) | ||
435 | { | ||
436 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
437 | Hashtable result = new Hashtable(); | ||
438 | |||
439 | UUID regionID; | ||
440 | if (UUID.TryParse((string)requestData["RegionUUID"], out regionID)) | ||
441 | { | ||
442 | if (OnRegionStartup != null) | ||
443 | OnRegionStartup(regionID); | ||
444 | |||
445 | result["responsestring"] = "TRUE"; | ||
446 | } | ||
447 | |||
448 | XmlRpcResponse response = new XmlRpcResponse(); | ||
449 | response.Value = result; | ||
450 | return response; | ||
451 | } | ||
452 | |||
453 | public XmlRpcResponse RegionShutdown(XmlRpcRequest request, IPEndPoint remoteClient) | ||
454 | { | ||
455 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
456 | Hashtable result = new Hashtable(); | ||
457 | |||
458 | UUID regionID; | ||
459 | if (UUID.TryParse((string)requestData["RegionUUID"], out regionID)) | ||
460 | { | ||
461 | if (OnRegionShutdown != null) | ||
462 | OnRegionShutdown(regionID); | ||
463 | |||
464 | result["responsestring"] = "TRUE"; | ||
465 | } | ||
466 | |||
467 | XmlRpcResponse response = new XmlRpcResponse(); | ||
468 | response.Value = result; | ||
469 | return response; | ||
470 | } | ||
471 | |||
472 | public XmlRpcResponse AgentLocation(XmlRpcRequest request, IPEndPoint remoteClient) | ||
473 | { | ||
474 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
475 | Hashtable result = new Hashtable(); | ||
476 | |||
477 | UUID agentID; | ||
478 | UUID regionID; | ||
479 | ulong regionHandle; | ||
480 | if (UUID.TryParse((string)requestData["AgentID"], out agentID) && UUID.TryParse((string)requestData["RegionUUID"], out regionID) && ulong.TryParse((string)requestData["RegionHandle"], out regionHandle)) | ||
481 | { | ||
482 | if (OnAgentLocation != null) | ||
483 | OnAgentLocation(agentID, regionID, regionHandle); | ||
484 | |||
485 | result["responsestring"] = "TRUE"; | ||
486 | } | ||
487 | |||
488 | XmlRpcResponse response = new XmlRpcResponse(); | ||
489 | response.Value = result; | ||
490 | return response; | ||
491 | } | ||
492 | |||
493 | public XmlRpcResponse AgentLeaving(XmlRpcRequest request, IPEndPoint remoteClient) | ||
494 | { | ||
495 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
496 | Hashtable result = new Hashtable(); | ||
497 | |||
498 | UUID agentID; | ||
499 | UUID regionID; | ||
500 | ulong regionHandle; | ||
501 | if (UUID.TryParse((string)requestData["AgentID"], out agentID) && UUID.TryParse((string)requestData["RegionUUID"], out regionID) && ulong.TryParse((string)requestData["RegionHandle"], out regionHandle)) | ||
502 | { | ||
503 | if (OnAgentLeaving != null) | ||
504 | OnAgentLeaving(agentID, regionID, regionHandle); | ||
505 | |||
506 | result["responsestring"] = "TRUE"; | ||
507 | } | ||
508 | |||
509 | XmlRpcResponse response = new XmlRpcResponse(); | ||
510 | response.Value = result; | ||
511 | return response; | ||
512 | } | ||
513 | } | ||
514 | } | ||