* More message server methods
parent
eadfbf3ba2
commit
bbac579849
|
@ -34,6 +34,7 @@ namespace OpenSim.Framework
|
|||
{
|
||||
public class FriendListItem
|
||||
{
|
||||
|
||||
public LLUUID FriendListOwner;
|
||||
public LLUUID Friend;
|
||||
|
||||
|
|
|
@ -30,13 +30,14 @@ using System.Net;
|
|||
using System.Net.Sockets;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
//using System.Xml;
|
||||
using libsecondlife;
|
||||
using Nwc.XmlRpc;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
using OpenSim.Framework.Data;
|
||||
using OpenSim.Framework.Servers;
|
||||
using FriendRights = libsecondlife.FriendRights;
|
||||
|
||||
namespace OpenSim.Grid.MessagingServer
|
||||
{
|
||||
|
@ -44,9 +45,16 @@ namespace OpenSim.Grid.MessagingServer
|
|||
{
|
||||
private LogBase m_log;
|
||||
private MessageServerConfig m_cfg;
|
||||
|
||||
//A hashtable of all current presences this server knows about
|
||||
private Hashtable m_presences = new Hashtable();
|
||||
|
||||
//a hashtable of all current regions this server knows about
|
||||
private Hashtable m_regionInfoCache = new Hashtable();
|
||||
|
||||
//A hashtable containing lists of UUIDs keyed by UUID for fast backreferencing
|
||||
private Hashtable m_presence_BackReferences = new Hashtable();
|
||||
|
||||
public MessageService(LogBase log, MessageServerConfig cfg)
|
||||
{
|
||||
m_log = log;
|
||||
|
@ -80,13 +88,104 @@ namespace OpenSim.Grid.MessagingServer
|
|||
}
|
||||
|
||||
ulong regionHandle = Convert.ToUInt64((string)requestData["regionhandle"]);
|
||||
|
||||
UserPresenceData up = new UserPresenceData();
|
||||
up.agentData = agentData;
|
||||
List<FriendListItem> flData = GetUserFriendList(agentData.AgentID);
|
||||
up.friendData = flData;
|
||||
RegionInfo riData = GetRegionInfo(regionHandle);
|
||||
up.regionData = riData;
|
||||
|
||||
m_presences.Add(regionHandle, agentData);
|
||||
ProcessFriendListSubscriptions(up);
|
||||
|
||||
|
||||
return new XmlRpcResponse();
|
||||
}
|
||||
#region FriendList Methods
|
||||
|
||||
#region FriendListProcessing
|
||||
|
||||
public void ProcessFriendListSubscriptions(UserPresenceData userpresence)
|
||||
{
|
||||
List<FriendListItem> uFriendList = userpresence.friendData;
|
||||
for (int i = 0; i < uFriendList.Count; i++)
|
||||
{
|
||||
if (m_presences.Contains(uFriendList[i].Friend))
|
||||
{
|
||||
UserPresenceData friendup = (UserPresenceData)m_presences[uFriendList[i]];
|
||||
SubscribeToPresenceUpdates(userpresence, friendup, uFriendList[i],i);
|
||||
}
|
||||
}
|
||||
|
||||
m_presences.Add(userpresence.agentData.AgentID, userpresence);
|
||||
}
|
||||
|
||||
public void SubscribeToPresenceUpdates(UserPresenceData userpresence, UserPresenceData friendpresence,
|
||||
FriendListItem uFriendListItem, int uFriendListIndex)
|
||||
{
|
||||
|
||||
if ((uFriendListItem.FriendListOwnerPerms & (uint)FriendRights.CanSeeOnline) != 0)
|
||||
{
|
||||
// Subscribe and Send Out updates
|
||||
// Add backreference
|
||||
m_presence_BackReferences.Add(userpresence.agentData.AgentID, friendpresence.agentData.AgentID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a backreference so presence specific data doesn't have to be
|
||||
/// enumerated for each logged in user every time someone logs on or off.
|
||||
/// </summary>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="friendID"></param>
|
||||
public void addBackReference(LLUUID agentID, LLUUID friendID)
|
||||
{
|
||||
if (m_presence_BackReferences.Contains(agentID))
|
||||
{
|
||||
List<LLUUID> presenseBackReferences = (List<LLUUID>)m_presence_BackReferences[agentID];
|
||||
if (!presenseBackReferences.Contains(friendID))
|
||||
{
|
||||
presenseBackReferences.Add(friendID);
|
||||
}
|
||||
m_presence_BackReferences[agentID] = presenseBackReferences;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<LLUUID> presenceBackReferences = new List<LLUUID>();
|
||||
presenceBackReferences.Add(friendID);
|
||||
m_presence_BackReferences[agentID] = presenceBackReferences;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes a backreference to free up some memory
|
||||
/// </summary>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="friendID"></param>
|
||||
public void removeBackReference(LLUUID agentID, LLUUID friendID)
|
||||
{
|
||||
if (m_presence_BackReferences.Contains(agentID))
|
||||
{
|
||||
List<LLUUID> presenseBackReferences = (List<LLUUID>)m_presence_BackReferences[agentID];
|
||||
if (presenseBackReferences.Contains(friendID))
|
||||
{
|
||||
presenseBackReferences.Remove(friendID);
|
||||
}
|
||||
|
||||
// If there are no more backreferences for this agent,
|
||||
// remove it to free up memory.
|
||||
if (presenseBackReferences.Count == 0)
|
||||
{
|
||||
m_presence_BackReferences.Remove(agentID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region FriendList Gathering
|
||||
|
||||
|
@ -147,6 +246,8 @@ namespace OpenSim.Grid.MessagingServer
|
|||
}
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
#region regioninfo gathering
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -38,6 +38,7 @@ namespace OpenSim.Grid.MessagingServer
|
|||
public AgentCircuitData agentData = new AgentCircuitData();
|
||||
public RegionInfo regionData = new RegionInfo();
|
||||
public List<FriendListItem> friendData = new List<FriendListItem> ();
|
||||
public List<LLUUID> subscriptionData = new List<LLUUID>();
|
||||
|
||||
public UserPresenceData()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue