aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs514
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
28using System.Collections;
29using System.Collections.Generic;
30using System.Net;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using Nwc.XmlRpc;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Framework.Servers;
38using OpenSim.Framework.Servers.HttpServer;
39using OpenSim.Grid.Framework;
40
41namespace 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}