From: Michael Osias <mosias@us.ibm.com>

This patch implements the llSendRemoteData command and fixes mantis 552,
and possibly 586.
This commit is contained in:
Sean Dague
2008-02-19 19:16:21 +00:00
parent 69b1edebf6
commit 530cc24884
10 changed files with 597 additions and 218 deletions

View File

@@ -84,8 +84,8 @@ namespace OpenSim.Region.Environment.Modules
m_scene = scene;
m_scene.RegisterModuleInterface<IWorldComm>(this);
m_listenerManager = new ListenerManager();
m_pending = new Queue<ListenerInfo>();
m_scene.EventManager.OnNewClient += NewClient;
m_pending = new Queue<ListenerInfo>();
}
public void PostInitialise()
@@ -139,9 +139,12 @@ namespace OpenSim.Region.Environment.Modules
public void DeleteListener(LLUUID itemID)
{
lock (ListLock)
if (m_listenerManager != null)
{
m_listenerManager.DeleteListener(itemID);
lock (ListLock)
{
m_listenerManager.DeleteListener(itemID);
}
}
}
@@ -167,14 +170,14 @@ namespace OpenSim.Region.Environment.Modules
// If they are in proximity, then if they are
// listeners, if so add them to the pending queue
foreach (LLUUID eb in m_scene.Entities.Keys)
foreach (ListenerInfo li in m_listenerManager.GetListeners())
{
EntityBase sPart;
m_scene.Entities.TryGetValue(eb, out sPart);
m_scene.Entities.TryGetValue(li.GetHostID(), out sPart);
// Dont process if this message is from itself!
if (eb.ToString().Equals(sourceItemID) ||
if (li.GetHostID().ToString().Equals(sourceItemID) ||
sPart.UUID.ToString().Equals(sourceItemID))
continue;
@@ -196,7 +199,10 @@ namespace OpenSim.Region.Environment.Modules
);
if (isListener != null)
{
m_pending.Enqueue(isListener);
lock (CommListLock)
{
m_pending.Enqueue(isListener);
}
}
}
break;
@@ -210,7 +216,10 @@ namespace OpenSim.Region.Environment.Modules
);
if (isListener != null)
{
m_pending.Enqueue(isListener);
lock (CommListLock)
{
m_pending.Enqueue(isListener);
}
}
}
break;
@@ -223,14 +232,17 @@ namespace OpenSim.Region.Environment.Modules
);
if (isListener != null)
{
m_pending.Enqueue(isListener);
lock (CommListLock)
{
m_pending.Enqueue(isListener);
}
}
}
break;
case ChatTypeEnum.Broadcast:
ListenerInfo isListen =
m_listenerManager.IsListenerMatch(sourceItemID, eb, channel, name, msg);
m_listenerManager.IsListenerMatch(sourceItemID, li.GetItemID(), channel, name, msg);
if (isListen != null)
{
ListenerInfo isListener = m_listenerManager.IsListenerMatch(
@@ -238,19 +250,24 @@ namespace OpenSim.Region.Environment.Modules
);
if (isListener != null)
{
m_pending.Enqueue(isListener);
lock (CommListLock)
{
m_pending.Enqueue(isListener);
}
}
}
break;
}
}
;
}
}
public bool HasMessages()
{
return (m_pending.Count > 0);
if (m_pending != null)
return (m_pending.Count > 0);
else
return false;
}
public ListenerInfo GetNextMessage()
@@ -264,6 +281,17 @@ namespace OpenSim.Region.Environment.Modules
return li;
}
public uint PeekNextMessageLocalID()
{
return m_pending.Peek().GetLocalID();
}
public LLUUID PeekNextMessageItemID()
{
return m_pending.Peek().GetItemID();
}
}
// hostID: the ID of the ScenePart
@@ -280,8 +308,7 @@ namespace OpenSim.Region.Environment.Modules
m_listeners = new Dictionary<int, ListenerInfo>();
}
public int AddListener(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id,
string msg)
public int AddListener(uint localID, LLUUID itemID, LLUUID hostID, int channel, string name, string id, string msg)
{
if (m_listeners.Count < m_MaxListeners)
{
@@ -410,6 +437,11 @@ namespace OpenSim.Region.Environment.Modules
}
return null;
}
public Dictionary<int, ListenerInfo>.ValueCollection GetListeners()
{
return m_listeners.Values;
}
}
public class ListenerInfo
@@ -425,21 +457,20 @@ namespace OpenSim.Region.Environment.Modules
private string m_message; // The message
private bool m_active; // Listener is active or not
public ListenerInfo(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name, LLUUID id,
string message)
public ListenerInfo(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name, LLUUID id, string message)
{
Initialise(localID, handle, ItemID, hostID, channel, name, id, message);
}
public ListenerInfo(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name, LLUUID id,
string message, LLUUID sourceItemID)
string message, LLUUID sourceItemID)
{
Initialise(localID, handle, ItemID, hostID, channel, name, id, message);
m_sourceItemID = sourceItemID;
}
private void Initialise(uint localID, int handle, LLUUID ItemID, LLUUID hostID, int channel, string name,
LLUUID id, string message)
LLUUID id, string message)
{
m_handle = handle;
m_channel = channel;
@@ -511,5 +542,6 @@ namespace OpenSim.Region.Environment.Modules
{
return m_id;
}
}
}
}