diff --git a/OpenSim/Grid/MessagingServer/MessageService.cs b/OpenSim/Grid/MessagingServer/MessageService.cs index d0b939bd22..fc16a88a52 100644 --- a/OpenSim/Grid/MessagingServer/MessageService.cs +++ b/OpenSim/Grid/MessagingServer/MessageService.cs @@ -30,6 +30,7 @@ using System.Net; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; +using System.Threading; //using System.Xml; using libsecondlife; using Nwc.XmlRpc; @@ -59,6 +60,8 @@ namespace OpenSim.Grid.MessagingServer // Hashtable containing work units that need to be processed private Hashtable m_unProcessedWorkUnits = new Hashtable(); + + public MessageService(MessageServerConfig cfg) { m_cfg = cfg; @@ -66,29 +69,7 @@ namespace OpenSim.Grid.MessagingServer #region RegionComms Methods - /// - /// Informs a region about an Agent - /// - /// User to talk about - /// User we're sending this too (contains the region) - public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate) - { - // TODO: Fill in pertenant Presence Data from 'TalkingAbout' - - RegionProfileData whichRegion = UserToUpdate.regionData; - //whichRegion.httpServerURI - - Hashtable PresenceParams = new Hashtable(); - ArrayList SendParams = new ArrayList(); - SendParams.Add(PresenceParams); - - m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI); - // Send - XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams); - XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000); - } - - + #endregion #region FriendList Methods @@ -152,7 +133,13 @@ namespace OpenSim.Grid.MessagingServer // we need to send out online status update, but the user is already subscribed } - SendRegionPresenceUpdate(friendpresence, userpresence); + PresenceInformer friendlistupdater = new PresenceInformer(); + friendlistupdater.presence1 = friendpresence; + friendlistupdater.presence2 = userpresence; + WaitCallback cb = new WaitCallback(friendlistupdater.go); + ThreadPool.QueueUserWorkItem(cb); + + //SendRegionPresenceUpdate(friendpresence, userpresence); } if ((uFriendListItem.FriendPerms & (uint)FriendRights.CanSeeOnline) != 0) { @@ -166,7 +153,14 @@ namespace OpenSim.Grid.MessagingServer // we need to send out online status update, but the user is already subscribed } - SendRegionPresenceUpdate(userpresence, friendpresence); + PresenceInformer friendlistupdater = new PresenceInformer(); + friendlistupdater.presence1 = userpresence; + friendlistupdater.presence2 = friendpresence; + + WaitCallback cb2 = new WaitCallback(friendlistupdater.go); + ThreadPool.QueueUserWorkItem(cb2); + + //SendRegionPresenceUpdate(userpresence, friendpresence); } } @@ -280,7 +274,14 @@ namespace OpenSim.Grid.MessagingServer m_presences[AgentsNeedingNotification[i]] = friendd; } - SendRegionPresenceUpdate(AgentData, friendd); + PresenceInformer friendlistupdater = new PresenceInformer(); + friendlistupdater.presence1 = AgentData; + friendlistupdater.presence2 = friendd; + + WaitCallback cb3 = new WaitCallback(friendlistupdater.go); + ThreadPool.QueueUserWorkItem(cb3); + + //SendRegionPresenceUpdate(AgentData, friendd); //removeBackReference(AgentID, AgentsNeedingNotification[i]); diff --git a/OpenSim/Grid/MessagingServer/PresenceInformer.cs b/OpenSim/Grid/MessagingServer/PresenceInformer.cs new file mode 100644 index 0000000000..877d104880 --- /dev/null +++ b/OpenSim/Grid/MessagingServer/PresenceInformer.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Text; +using libsecondlife; +using Nwc.XmlRpc; +using OpenSim.Framework; +using OpenSim.Framework.Console; +using OpenSim.Framework.Data; +using OpenSim.Framework.Servers; + +namespace OpenSim.Grid.MessagingServer +{ + public class PresenceInformer + { + public UserPresenceData presence1 = null; + public UserPresenceData presence2 = null; + private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + public PresenceInformer() + { + + } + public void go(object o) + { + if (presence1 != null && presence2 != null) + { + SendRegionPresenceUpdate(presence1, presence2); + } + + } + + /// + /// Informs a region about an Agent + /// + /// User to talk about + /// User we're sending this too (contains the region) + public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate) + { + // TODO: Fill in pertenant Presence Data from 'TalkingAbout' + + RegionProfileData whichRegion = UserToUpdate.regionData; + //whichRegion.httpServerURI + + Hashtable PresenceParams = new Hashtable(); + ArrayList SendParams = new ArrayList(); + SendParams.Add(PresenceParams); + + m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI); + // Send + XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams); + XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000); + } + + + } +}