aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/MessageServerConfig.cs9
-rw-r--r--OpenSim/Framework/UserConfig.cs4
-rw-r--r--OpenSim/Grid/MessagingServer/Main.cs22
-rw-r--r--OpenSim/Grid/MessagingServer/MessageService.cs155
-rw-r--r--OpenSim/Grid/MessagingServer/PresenceInformer.cs81
-rw-r--r--OpenSim/Grid/MessagingServer/UserPresenceData.cs1
-rw-r--r--OpenSim/Grid/UserServer/MessageServersConnector.cs6
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs8
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs132
9 files changed, 374 insertions, 44 deletions
diff --git a/OpenSim/Framework/MessageServerConfig.cs b/OpenSim/Framework/MessageServerConfig.cs
index c378d27..7a50c91 100644
--- a/OpenSim/Framework/MessageServerConfig.cs
+++ b/OpenSim/Framework/MessageServerConfig.cs
@@ -38,6 +38,7 @@ namespace OpenSim.Framework
38 public static bool DefaultHttpSSL = false; 38 public static bool DefaultHttpSSL = false;
39 private ConfigurationMember configMember; 39 private ConfigurationMember configMember;
40 public string DatabaseProvider = String.Empty; 40 public string DatabaseProvider = String.Empty;
41 public string DatabaseConnect = String.Empty;
41 public string DefaultStartupMsg = String.Empty; 42 public string DefaultStartupMsg = String.Empty;
42 public string GridCommsProvider = String.Empty; 43 public string GridCommsProvider = String.Empty;
43 public string GridRecvKey = String.Empty; 44 public string GridRecvKey = String.Empty;
@@ -76,6 +77,11 @@ namespace OpenSim.Framework
76 configMember.addConfigurationOption("grid_recv_key", ConfigurationOption.ConfigurationTypes.TYPE_STRING, 77 configMember.addConfigurationOption("grid_recv_key", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
77 "Key to expect from user server", "null", false); 78 "Key to expect from user server", "null", false);
78 79
80
81 configMember.addConfigurationOption("database_connect", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
82 "Connection String for Database", "", false);
83
84
79 configMember.addConfigurationOption("database_provider", ConfigurationOption.ConfigurationTypes.TYPE_STRING, 85 configMember.addConfigurationOption("database_provider", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
80 "DLL for database provider", "OpenSim.Data.MySQL.dll", false); 86 "DLL for database provider", "OpenSim.Data.MySQL.dll", false);
81 87
@@ -115,6 +121,9 @@ namespace OpenSim.Framework
115 case "database_provider": 121 case "database_provider":
116 DatabaseProvider = (string) configuration_result; 122 DatabaseProvider = (string) configuration_result;
117 break; 123 break;
124 case "database_connect":
125 DatabaseConnect = (string)configuration_result;
126 break;
118 case "http_port": 127 case "http_port":
119 HttpPort = (uint) configuration_result; 128 HttpPort = (uint) configuration_result;
120 break; 129 break;
diff --git a/OpenSim/Framework/UserConfig.cs b/OpenSim/Framework/UserConfig.cs
index 3c0bdfa..3cb0503 100644
--- a/OpenSim/Framework/UserConfig.cs
+++ b/OpenSim/Framework/UserConfig.cs
@@ -49,6 +49,10 @@ namespace OpenSim.Framework
49 public bool HttpSSL = DefaultHttpSSL; 49 public bool HttpSSL = DefaultHttpSSL;
50 public string InventoryUrl = String.Empty; 50 public string InventoryUrl = String.Empty;
51 51
52 public UserConfig()
53 {
54 // weird, but UserManagerBase needs this.
55 }
52 public UserConfig(string description, string filename) 56 public UserConfig(string description, string filename)
53 { 57 {
54 configMember = 58 configMember =
diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs
index d2fa659..91f2101 100644
--- a/OpenSim/Grid/MessagingServer/Main.cs
+++ b/OpenSim/Grid/MessagingServer/Main.cs
@@ -31,7 +31,9 @@ using System.Reflection;
31using libsecondlife; 31using libsecondlife;
32using log4net; 32using log4net;
33using log4net.Config; 33using log4net.Config;
34
34using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Communications.Cache;
35using OpenSim.Framework.Console; 37using OpenSim.Framework.Console;
36using OpenSim.Framework.Servers; 38using OpenSim.Framework.Servers;
37 39
@@ -88,6 +90,8 @@ namespace OpenSim.Grid.MessagingServer
88 m_log.Info("[REGION]: Starting HTTP process"); 90 m_log.Info("[REGION]: Starting HTTP process");
89 m_httpServer = new BaseHttpServer(Cfg.HttpPort); 91 m_httpServer = new BaseHttpServer(Cfg.HttpPort);
90 92
93
94
91 msgsvc = new MessageService(Cfg); 95 msgsvc = new MessageService(Cfg);
92 96
93 if (msgsvc.registerWithUserServer()) 97 if (msgsvc.registerWithUserServer())
@@ -144,6 +148,24 @@ namespace OpenSim.Grid.MessagingServer
144 } 148 }
145 } 149 }
146 150
151 public override void RunCmd(string cmd, string[] cmdparams)
152 {
153 base.RunCmd(cmd, cmdparams);
154
155 switch (cmd)
156 {
157 case "help":
158 m_console.Notice("clear-cache - Clears region cache. Should be done when regions change position. The region cache gets stale after a while.");
159 break;
160 case "clear-cache":
161 int entries = msgsvc.ClearRegionCache();
162 m_console.Notice("Region cache cleared! Cleared " + entries.ToString() + " entries");
163 break;
164 }
165
166
167 }
168
147 public override void Shutdown() 169 public override void Shutdown()
148 { 170 {
149 msgsvc.deregisterWithUserServer(); 171 msgsvc.deregisterWithUserServer();
diff --git a/OpenSim/Grid/MessagingServer/MessageService.cs b/OpenSim/Grid/MessagingServer/MessageService.cs
index e1beef1..59fef7e 100644
--- a/OpenSim/Grid/MessagingServer/MessageService.cs
+++ b/OpenSim/Grid/MessagingServer/MessageService.cs
@@ -46,6 +46,7 @@ namespace OpenSim.Grid.MessagingServer
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 private MessageServerConfig m_cfg; 48 private MessageServerConfig m_cfg;
49 private UserManager m_userManager;
49 50
50 //A hashtable of all current presences this server knows about 51 //A hashtable of all current presences this server knows about
51 private Hashtable m_presences = new Hashtable(); 52 private Hashtable m_presences = new Hashtable();
@@ -62,11 +63,16 @@ namespace OpenSim.Grid.MessagingServer
62 public MessageService(MessageServerConfig cfg) 63 public MessageService(MessageServerConfig cfg)
63 { 64 {
64 m_cfg = cfg; 65 m_cfg = cfg;
66 m_userManager = new UserManager();
67 UserConfig uc = new UserConfig();
68 uc.DatabaseConnect = cfg.DatabaseConnect;
69 uc.DatabaseProvider = cfg.DatabaseProvider;
70
71 m_userManager._config = uc;
72 m_userManager.AddPlugin(cfg.DatabaseProvider, cfg.DatabaseConnect);
65 } 73 }
66 74
67 #region RegionComms Methods 75
68
69 #endregion
70 76
71 #region FriendList Methods 77 #region FriendList Methods
72 78
@@ -123,11 +129,27 @@ namespace OpenSim.Grid.MessagingServer
123 { 129 {
124 // we need to send out online status update, but the user is already subscribed 130 // we need to send out online status update, but the user is already subscribed
125 } 131 }
126 PresenceInformer friendlistupdater = new PresenceInformer(); 132 UserAgentData p2Handle = m_userManager.GetUserAgentData(userpresence.agentData.AgentID);
127 friendlistupdater.presence1 = friendpresence; 133 if (p2Handle != null)
128 friendlistupdater.presence2 = userpresence; 134 {
129 WaitCallback cb = new WaitCallback(friendlistupdater.go); 135
130 ThreadPool.QueueUserWorkItem(cb); 136 userpresence.regionData.regionHandle = p2Handle.Handle;
137 PresenceInformer friendlistupdater = new PresenceInformer();
138 friendlistupdater.presence1 = friendpresence;
139 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
140 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
141 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
142 friendlistupdater.presence2 = userpresence;
143 friendlistupdater.OnGetRegionData += GetRegionInfo;
144 friendlistupdater.OnDone += PresenceUpdateDone;
145 WaitCallback cb = new WaitCallback(friendlistupdater.go);
146 ThreadPool.QueueUserWorkItem(cb);
147
148 }
149 else
150 {
151 // Skip because we can't find any data on the user
152 }
131 153
132 //SendRegionPresenceUpdate(friendpresence, userpresence); 154 //SendRegionPresenceUpdate(friendpresence, userpresence);
133 } 155 }
@@ -143,12 +165,30 @@ namespace OpenSim.Grid.MessagingServer
143 { 165 {
144 // we need to send out online status update, but the user is already subscribed 166 // we need to send out online status update, but the user is already subscribed
145 } 167 }
146 PresenceInformer friendlistupdater = new PresenceInformer(); 168
147 friendlistupdater.presence1 = userpresence; 169 UserAgentData p2Handle = m_userManager.GetUserAgentData(friendpresence.agentData.AgentID);
148 friendlistupdater.presence2 = friendpresence;
149 170
150 WaitCallback cb2 = new WaitCallback(friendlistupdater.go); 171 if (p2Handle != null)
151 ThreadPool.QueueUserWorkItem(cb2); 172 {
173
174 friendpresence.regionData.regionHandle = p2Handle.Handle;
175 PresenceInformer friendlistupdater = new PresenceInformer();
176 friendlistupdater.presence1 = userpresence;
177 friendlistupdater.presence2 = friendpresence;
178 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
179 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
180 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
181 friendlistupdater.OnGetRegionData += GetRegionInfo;
182 friendlistupdater.OnDone += PresenceUpdateDone;
183 WaitCallback cb2 = new WaitCallback(friendlistupdater.go);
184 ThreadPool.QueueUserWorkItem(cb2);
185 }
186 else
187 {
188 // skip, agent doesn't appear to exist anymore
189 }
190
191
152 192
153 //SendRegionPresenceUpdate(userpresence, friendpresence); 193 //SendRegionPresenceUpdate(userpresence, friendpresence);
154 } 194 }
@@ -209,6 +249,7 @@ namespace OpenSim.Grid.MessagingServer
209 /// <param name="AgentID"></param> 249 /// <param name="AgentID"></param>
210 private void ProcessLogOff(LLUUID AgentID) 250 private void ProcessLogOff(LLUUID AgentID)
211 { 251 {
252 m_log.Info("[LOGOFF]: Processing Logoff");
212 UserPresenceData AgentData = null; 253 UserPresenceData AgentData = null;
213 List<LLUUID> AgentsNeedingNotification = new List<LLUUID>(); 254 List<LLUUID> AgentsNeedingNotification = new List<LLUUID>();
214 UserPresenceData friendd = null; 255 UserPresenceData friendd = null;
@@ -223,6 +264,7 @@ namespace OpenSim.Grid.MessagingServer
223 if (AgentData != null) 264 if (AgentData != null)
224 { 265 {
225 AgentsNeedingNotification = AgentData.subscriptionData; 266 AgentsNeedingNotification = AgentData.subscriptionData;
267 AgentData.OnlineYN = false;
226 //lock (m_presence_BackReferences) 268 //lock (m_presence_BackReferences)
227 //{ 269 //{
228 //if (m_presence_BackReferences.Contains(AgentID)) 270 //if (m_presence_BackReferences.Contains(AgentID))
@@ -262,13 +304,33 @@ namespace OpenSim.Grid.MessagingServer
262 m_presences[AgentsNeedingNotification[i]] = friendd; 304 m_presences[AgentsNeedingNotification[i]] = friendd;
263 } 305 }
264 306
265 PresenceInformer friendlistupdater = new PresenceInformer(); 307 UserAgentData p2Handle = m_userManager.GetUserAgentData(friendd.agentData.AgentID);
266 friendlistupdater.presence1 = AgentData; 308 if (p2Handle != null)
267 friendlistupdater.presence2 = friendd; 309 {
310
311
312 friendd.regionData.regionHandle = p2Handle.Handle;
313 PresenceInformer friendlistupdater = new PresenceInformer();
314 friendlistupdater.presence1 = AgentData;
315 friendlistupdater.presence2 = friendd;
316
317 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
318 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
319 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
320
321 friendlistupdater.OnGetRegionData += GetRegionInfo;
322 friendlistupdater.OnDone += PresenceUpdateDone;
323
324 WaitCallback cb3 = new WaitCallback(friendlistupdater.go);
325 ThreadPool.QueueUserWorkItem(cb3);
268 326
269 WaitCallback cb3 = new WaitCallback(friendlistupdater.go); 327
270 ThreadPool.QueueUserWorkItem(cb3);
271 328
329 }
330 else
331 {
332 // skip, agent can't be found
333 }
272 //SendRegionPresenceUpdate(AgentData, friendd); 334 //SendRegionPresenceUpdate(AgentData, friendd);
273 335
274 //removeBackReference(AgentID, AgentsNeedingNotification[i]); 336 //removeBackReference(AgentID, AgentsNeedingNotification[i]);
@@ -279,6 +341,12 @@ namespace OpenSim.Grid.MessagingServer
279 341
280 #endregion 342 #endregion
281 343
344 public void PresenceUpdateDone(PresenceInformer obj)
345 {
346 obj.OnGetRegionData -= GetRegionInfo;
347 obj.OnDone -= PresenceUpdateDone;
348 }
349
282 #region UserServer Comms 350 #region UserServer Comms
283 351
284 /// <summary> 352 /// <summary>
@@ -393,7 +461,7 @@ namespace OpenSim.Grid.MessagingServer
393 up.friendData = flData; 461 up.friendData = flData;
394 RegionProfileData riData = GetRegionInfo(regionHandle); 462 RegionProfileData riData = GetRegionInfo(regionHandle);
395 up.regionData = riData; 463 up.regionData = riData;
396 464 up.OnlineYN = true;
397 ProcessFriendListSubscriptions(up); 465 ProcessFriendListSubscriptions(up);
398 466
399 return new XmlRpcResponse(); 467 return new XmlRpcResponse();
@@ -407,6 +475,7 @@ namespace OpenSim.Grid.MessagingServer
407 /// <returns></returns> 475 /// <returns></returns>
408 public XmlRpcResponse UserLoggedOff(XmlRpcRequest request) 476 public XmlRpcResponse UserLoggedOff(XmlRpcRequest request)
409 { 477 {
478 m_log.Info("[USERLOGOFF]: User logged off called");
410 Hashtable requestData = (Hashtable)request.Params[0]; 479 Hashtable requestData = (Hashtable)request.Params[0];
411 480
412 LLUUID AgentID = new LLUUID((string)requestData["agentid"]); 481 LLUUID AgentID = new LLUUID((string)requestData["agentid"]);
@@ -423,23 +492,64 @@ namespace OpenSim.Grid.MessagingServer
423 /// <summary> 492 /// <summary>
424 /// Gets and caches a RegionInfo object from the gridserver based on regionhandle 493 /// Gets and caches a RegionInfo object from the gridserver based on regionhandle
425 /// if the regionhandle is already cached, use the cached values 494 /// if the regionhandle is already cached, use the cached values
495 /// Gets called by lots of threads!!!!!
426 /// </summary> 496 /// </summary>
427 /// <param name="regionhandle">handle to the XY of the region we're looking for</param> 497 /// <param name="regionhandle">handle to the XY of the region we're looking for</param>
428 /// <returns>A RegionInfo object to stick in the presence info</returns> 498 /// <returns>A RegionInfo object to stick in the presence info</returns>
429 public RegionProfileData GetRegionInfo(ulong regionhandle) 499 public RegionProfileData GetRegionInfo(ulong regionhandle)
430 { 500 {
431 RegionProfileData regionInfo = null; 501 RegionProfileData regionInfo = null;
432 if (m_regionInfoCache.Contains(regionhandle)) 502 bool lookup = false;
503
504 lock (m_regionInfoCache)
433 { 505 {
434 regionInfo = (RegionProfileData)m_regionInfoCache[regionhandle]; 506 if (m_regionInfoCache.Contains(regionhandle))
507 {
508 regionInfo = (RegionProfileData)m_regionInfoCache[regionhandle];
509 }
510 else
511 {
512 // Don't lock the cache while we're looking up the region!
513 lookup = true;
514 }
435 } 515 }
436 else 516
517 if (lookup)
437 { 518 {
438 regionInfo = RequestRegionInfo(regionhandle); 519 regionInfo = RequestRegionInfo(regionhandle);
520
521 if (regionInfo != null)
522 {
523 lock (m_regionInfoCache)
524 {
525 if (m_regionInfoCache.Contains(regionhandle))
526 {
527 m_regionInfoCache[regionhandle] = regionInfo;
528 }
529 else
530 {
531 m_regionInfoCache.Add(regionhandle, regionInfo);
532 }
533 }
534 }
439 } 535 }
536
440 return regionInfo; 537 return regionInfo;
441 } 538 }
442 539
540 public int ClearRegionCache()
541 {
542 int cachecount = 0;
543
544 lock (m_regionInfoCache)
545 {
546 cachecount = m_regionInfoCache.Count;
547 m_regionInfoCache.Clear();
548 }
549
550 return cachecount;
551 }
552
443 /// <summary> 553 /// <summary>
444 /// Get RegionProfileData from the GridServer 554 /// Get RegionProfileData from the GridServer
445 /// We'll Cache this information and use it for presence updates 555 /// We'll Cache this information and use it for presence updates
@@ -541,6 +651,7 @@ namespace OpenSim.Grid.MessagingServer
541 // Process Response 651 // Process Response
542 if (GridRespData.ContainsKey("responsestring")) 652 if (GridRespData.ContainsKey("responsestring"))
543 { 653 {
654
544 return true; 655 return true;
545 } 656 }
546 else 657 else
diff --git a/OpenSim/Grid/MessagingServer/PresenceInformer.cs b/OpenSim/Grid/MessagingServer/PresenceInformer.cs
index 59d0e13..050d88a 100644
--- a/OpenSim/Grid/MessagingServer/PresenceInformer.cs
+++ b/OpenSim/Grid/MessagingServer/PresenceInformer.cs
@@ -27,16 +27,31 @@
27 27
28using System.Collections; 28using System.Collections;
29using System.Reflection; 29using System.Reflection;
30using System.Net;
30using log4net; 31using log4net;
31using Nwc.XmlRpc; 32using Nwc.XmlRpc;
32using OpenSim.Data; 33using OpenSim.Data;
33 34
34namespace OpenSim.Grid.MessagingServer 35namespace OpenSim.Grid.MessagingServer
35{ 36{
37 public delegate RegionProfileData GetRegionData(ulong region_handle);
38 public delegate void Done(PresenceInformer obj);
39
40
36 public class PresenceInformer 41 public class PresenceInformer
37 { 42 {
43 public event GetRegionData OnGetRegionData;
44 public event Done OnDone;
45
46 private GetRegionData handlerGetRegionData = null;
47 private Done handlerDone = null;
48
38 public UserPresenceData presence1 = null; 49 public UserPresenceData presence1 = null;
39 public UserPresenceData presence2 = null; 50 public UserPresenceData presence2 = null;
51 public string gridserverurl, gridserversendkey, gridserverrecvkey;
52 public bool lookupRegion = true;
53 //public methodGroup
54
40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41 56
42 public PresenceInformer() 57 public PresenceInformer()
@@ -60,18 +75,68 @@ namespace OpenSim.Grid.MessagingServer
60 public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate) 75 public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate)
61 { 76 {
62 // TODO: Fill in pertenant Presence Data from 'TalkingAbout' 77 // TODO: Fill in pertenant Presence Data from 'TalkingAbout'
78 RegionProfileData whichRegion = new RegionProfileData();
79 if (lookupRegion)
80 {
81 handlerGetRegionData = OnGetRegionData;
82 if (handlerGetRegionData != null)
83 {
84 whichRegion = handlerGetRegionData(UserToUpdate.regionData.regionHandle);
85 }
86 //RegionProfileData rp = RegionProfileData.RequestSimProfileData(UserToUpdate.regionData.regionHandle, gridserverurl, gridserversendkey, gridserverrecvkey);
63 87
64 RegionProfileData whichRegion = UserToUpdate.regionData; 88 //whichRegion = rp;
89 }
90 else
91 {
92 whichRegion = UserToUpdate.regionData;
93 }
65 //whichRegion.httpServerURI 94 //whichRegion.httpServerURI
66 95
67 Hashtable PresenceParams = new Hashtable(); 96 if (whichRegion != null)
68 ArrayList SendParams = new ArrayList(); 97 {
69 SendParams.Add(PresenceParams); 98
99
100 Hashtable PresenceParams = new Hashtable();
101 PresenceParams.Add("agent_id",TalkingAbout.agentData.AgentID.ToString());
102 PresenceParams.Add("notify_id",UserToUpdate.agentData.AgentID.ToString());
103 if (TalkingAbout.OnlineYN)
104 PresenceParams.Add("status","TRUE");
105 else
106 PresenceParams.Add("status","FALSE");
107
108
109
110
111 ArrayList SendParams = new ArrayList();
112 SendParams.Add(PresenceParams);
113
114
115 m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI);
116 // Send
117 XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams);
118 try
119 {
120
121 XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000);
122 }
123 catch (WebException)
124 {
125 m_log.WarnFormat("[INFORM]: failed notifying region {0} containing user {1} about {2}", whichRegion.regionName, UserToUpdate.agentData.firstname + " " + UserToUpdate.agentData.lastname, TalkingAbout.agentData.firstname + " " + TalkingAbout.agentData.lastname);
126 }
127 }
128 else
129 {
130 m_log.Info("[PRESENCEUPDATER]: Region data was null skipping");
131
132 }
133
134 handlerDone = OnDone;
135 if (handlerDone != null)
136 {
137 handlerDone(this);
138 }
70 139
71 m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI);
72 // Send
73 XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams);
74 XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000);
75 } 140 }
76 } 141 }
77} 142}
diff --git a/OpenSim/Grid/MessagingServer/UserPresenceData.cs b/OpenSim/Grid/MessagingServer/UserPresenceData.cs
index 7188201..74a6032 100644
--- a/OpenSim/Grid/MessagingServer/UserPresenceData.cs
+++ b/OpenSim/Grid/MessagingServer/UserPresenceData.cs
@@ -40,6 +40,7 @@ namespace OpenSim.Grid.MessagingServer
40 public string httpURI = String.Empty; 40 public string httpURI = String.Empty;
41 public List<FriendListItem> friendData = new List<FriendListItem> (); 41 public List<FriendListItem> friendData = new List<FriendListItem> ();
42 public List<LLUUID> subscriptionData = new List<LLUUID>(); 42 public List<LLUUID> subscriptionData = new List<LLUUID>();
43 public bool OnlineYN = false;
43 44
44 public UserPresenceData() 45 public UserPresenceData()
45 { 46 {
diff --git a/OpenSim/Grid/UserServer/MessageServersConnector.cs b/OpenSim/Grid/UserServer/MessageServersConnector.cs
index 529c089..208131e 100644
--- a/OpenSim/Grid/UserServer/MessageServersConnector.cs
+++ b/OpenSim/Grid/UserServer/MessageServersConnector.cs
@@ -185,12 +185,12 @@ namespace OpenSim.Grid.UserServer
185 { 185 {
186 if (MessageServers.Count > 0) 186 if (MessageServers.Count > 0)
187 { 187 {
188 m_log.Info("[MSGCONNECTOR]: Sending login notice to registered message servers"); 188 m_log.Info("[MSGCONNECTOR]: Sending logoff notice to registered message servers");
189 } 189 }
190 else 190 else
191// { 191 {
192// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring"); 192// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring");
193// } 193 }
194 foreach (MessageServerInfo serv in MessageServers.Values) 194 foreach (MessageServerInfo serv in MessageServers.Values)
195 { 195 {
196 NotifyMessageServerAboutUserLogoff(serv,agentID); 196 NotifyMessageServerAboutUserLogoff(serv,agentID);
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 2e892c2..0daabc5 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -382,7 +382,13 @@ namespace OpenSim.Region.Communications.OGS1
382 regionInfo.RegionID = new LLUUID((string) responseData["region_UUID"]); 382 regionInfo.RegionID = new LLUUID((string) responseData["region_UUID"]);
383 regionInfo.RegionName = (string) responseData["region_name"]; 383 regionInfo.RegionName = (string) responseData["region_name"];
384 384
385 m_remoteRegionInfoCache.Add(regionHandle, regionInfo); 385 lock (m_remoteRegionInfoCache)
386 {
387 if (!m_remoteRegionInfoCache.ContainsKey(regionHandle))
388 {
389 m_remoteRegionInfoCache.Add(regionHandle, regionInfo);
390 }
391 }
386 } 392 }
387 catch (WebException) 393 catch (WebException)
388 { 394 {
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
index c82f88d..92c808b 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
@@ -25,6 +25,7 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27using System; 27using System;
28using System.Collections;
28using System.Collections.Generic; 29using System.Collections.Generic;
29using System.Reflection; 30using System.Reflection;
30using libsecondlife; 31using libsecondlife;
@@ -45,6 +46,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
45 private Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>(); 46 private Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>();
46 private Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); 47 private Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>();
47 private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>(); 48 private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>();
49 private Dictionary<LLUUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<LLUUID, List<StoredFriendListUpdate>>();
50
48 private List<Scene> m_scene = new List<Scene>(); 51 private List<Scene> m_scene = new List<Scene>();
49 52
50 #region IRegionModule Members 53 #region IRegionModule Members
@@ -91,6 +94,73 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
91 public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req) 94 public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req)
92 { 95 {
93 m_log.Info("[FRIENDS]: Got Notification about a user! OMG"); 96 m_log.Info("[FRIENDS]: Got Notification about a user! OMG");
97 Hashtable requestData = (Hashtable)req.Params[0];
98 if (requestData.ContainsKey("agent_id") && requestData.ContainsKey("notify_id") && requestData.ContainsKey("status"))
99 {
100 LLUUID notifyAgentId = LLUUID.Zero;
101 LLUUID notifyAboutAgentId = LLUUID.Zero;
102 bool notifyOnlineStatus = false;
103
104 if ((string)requestData["status"] == "TRUE")
105 notifyOnlineStatus = true;
106
107 Helpers.TryParse((string)requestData["notify_id"], out notifyAgentId);
108
109 Helpers.TryParse((string)requestData["agent_id"], out notifyAboutAgentId);
110
111 ScenePresence avatar = GetPresenceFromAgentID(notifyAgentId);
112 if (avatar != null)
113 {
114 if (avatar.IsChildAgent)
115 {
116 StoredFriendListUpdate sob = new StoredFriendListUpdate();
117 sob.OnlineYN = notifyOnlineStatus;
118 sob.storedAbout = notifyAboutAgentId;
119 sob.storedFor = notifyAgentId;
120 lock (StoredFriendListUpdates)
121 {
122 if (StoredFriendListUpdates.ContainsKey(notifyAgentId))
123 {
124 StoredFriendListUpdates[notifyAgentId].Add(sob);
125 }
126 else
127 {
128 List<StoredFriendListUpdate> newitem = new List<StoredFriendListUpdate>();
129 newitem.Add(sob);
130 StoredFriendListUpdates.Add(notifyAgentId, newitem);
131 }
132 }
133 }
134 else
135 {
136 if (notifyOnlineStatus)
137 doFriendListUpdateOnline(notifyAboutAgentId);
138 else
139 ClientLoggedOut(notifyAboutAgentId);
140 }
141 }
142 else
143 {
144 StoredFriendListUpdate sob = new StoredFriendListUpdate();
145 sob.OnlineYN = notifyOnlineStatus;
146 sob.storedAbout = notifyAboutAgentId;
147 sob.storedFor = notifyAgentId;
148 lock (StoredFriendListUpdates)
149 {
150 if (StoredFriendListUpdates.ContainsKey(notifyAgentId))
151 {
152 StoredFriendListUpdates[notifyAgentId].Add(sob);
153 }
154 else
155 {
156 List<StoredFriendListUpdate> newitem = new List<StoredFriendListUpdate>();
157 newitem.Add(sob);
158 StoredFriendListUpdates.Add(notifyAgentId, newitem);
159 }
160 }
161 }
162
163 }
94 return new XmlRpcResponse(); 164 return new XmlRpcResponse();
95 } 165 }
96 166
@@ -110,24 +180,30 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
110 client.OnDenyFriendRequest += OnDenyFriendRequest; 180 client.OnDenyFriendRequest += OnDenyFriendRequest;
111 client.OnTerminateFriendship += OnTerminateFriendship; 181 client.OnTerminateFriendship += OnTerminateFriendship;
112 182
183 doFriendListUpdateOnline(client.AgentId);
184
185 }
186
187 private void doFriendListUpdateOnline(LLUUID AgentId)
188 {
113 List<FriendListItem> fl = new List<FriendListItem>(); 189 List<FriendListItem> fl = new List<FriendListItem>();
114 190
115 //bool addFLback = false; 191 //bool addFLback = false;
116 192
117 lock (FriendLists) 193 lock (FriendLists)
118 { 194 {
119 if (FriendLists.ContainsKey(client.AgentId)) 195 if (FriendLists.ContainsKey(AgentId))
120 { 196 {
121 fl = FriendLists[client.AgentId]; 197 fl = FriendLists[AgentId];
122 } 198 }
123 else 199 else
124 { 200 {
125 fl = m_scene[0].GetFriendList(client.AgentId); 201 fl = m_scene[0].GetFriendList(AgentId);
126 202
127 //lock (FriendLists) 203 //lock (FriendLists)
128 //{ 204 //{
129 if (!FriendLists.ContainsKey(client.AgentId)) 205 if (!FriendLists.ContainsKey(AgentId))
130 FriendLists.Add(client.AgentId, fl); 206 FriendLists.Add(AgentId, fl);
131 //} 207 //}
132 } 208 }
133 } 209 }
@@ -161,11 +237,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
161 { 237 {
162 foreach (FriendListItem fli in usrfl) 238 foreach (FriendListItem fli in usrfl)
163 { 239 {
164 if (fli.Friend == client.AgentId) 240 if (fli.Friend == AgentId)
165 { 241 {
166 fli.onlinestatus = true; 242 fli.onlinestatus = true;
167 LLUUID[] Agents = new LLUUID[1]; 243 LLUUID[] Agents = new LLUUID[1];
168 Agents[0] = client.AgentId; 244 Agents[0] = AgentId;
169 av.ControllingClient.SendAgentOnline(Agents); 245 av.ControllingClient.SendAgentOnline(Agents);
170 246
171 } 247 }
@@ -176,8 +252,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
176 252
177 if (UpdateUsers.Count > 0) 253 if (UpdateUsers.Count > 0)
178 { 254 {
179 255 ScenePresence avatar = GetPresenceFromAgentID(AgentId);
180 client.SendAgentOnline(UpdateUsers.ToArray()); 256 if (avatar != null)
257 {
258 avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray());
259 }
181 260
182 } 261 }
183 } 262 }
@@ -302,6 +381,27 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
302 { 381 {
303 m_rootAgents.Add(avatar.UUID, avatar.RegionHandle); 382 m_rootAgents.Add(avatar.UUID, avatar.RegionHandle);
304 m_log.Info("[FRIEND]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); 383 m_log.Info("[FRIEND]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + ".");
384
385 List<StoredFriendListUpdate> updateme = new List<StoredFriendListUpdate>();
386 lock (StoredFriendListUpdates)
387 {
388 if (StoredFriendListUpdates.ContainsKey(avatar.UUID))
389 {
390 updateme = StoredFriendListUpdates[avatar.UUID];
391 StoredFriendListUpdates.Remove(avatar.UUID);
392 }
393 }
394
395 if (updateme.Count > 0)
396 {
397 foreach (StoredFriendListUpdate u in updateme)
398 {
399 if (u.OnlineYN)
400 doFriendListUpdateOnline(u.storedAbout);
401 else
402 ClientLoggedOut(u.storedAbout);
403 }
404 }
305 } 405 }
306 } 406 }
307 //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); 407 //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString());
@@ -441,8 +541,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
441 541
442 SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); 542 SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
443 SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint) 1); 543 SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint) 1);
444 m_pendingFriendRequests.Remove(transactionID); 544
545
546 //LLUUID[] Agents = new LLUUID[1];
547 //Agents[0] = msg.toAgentID;
548 //av.ControllingClient.SendAgentOnline(Agents);
445 549
550 m_pendingFriendRequests.Remove(transactionID);
446 // TODO: Inform agent that the friend is online 551 // TODO: Inform agent that the friend is online
447 } 552 }
448 } 553 }
@@ -498,4 +603,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
498 603
499 #endregion 604 #endregion
500 } 605 }
606
607 public struct StoredFriendListUpdate
608 {
609 public LLUUID storedFor;
610 public LLUUID storedAbout;
611 public bool OnlineYN;
612 }
501} 613}