mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 06:06:06 +08:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user