Merge branch 'avination' into ubitwork
commit
9a80330875
|
@ -51,7 +51,8 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
public enum EventType : int
|
||||
{
|
||||
Normal = 0,
|
||||
LslHttp = 1
|
||||
LslHttp = 1,
|
||||
Inventory = 2
|
||||
}
|
||||
|
||||
public PollServiceEventArgs(
|
||||
|
|
|
@ -231,7 +231,8 @@ namespace OpenSim.Framework.Servers.HttpServer
|
|||
{
|
||||
if (m_running)
|
||||
{
|
||||
if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LslHttp)
|
||||
if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.LslHttp ||
|
||||
req.PollServiceArgs.Type == PollServiceEventArgs.EventType.Inventory)
|
||||
{
|
||||
m_requests.Enqueue(req);
|
||||
}
|
||||
|
|
|
@ -27,12 +27,15 @@
|
|||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using Mono.Addins;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
@ -48,67 +51,49 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class WebFetchInvDescModule : INonSharedRegionModule
|
||||
{
|
||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Scene m_scene;
|
||||
|
||||
private IInventoryService m_InventoryService;
|
||||
private ILibraryService m_LibraryService;
|
||||
|
||||
private bool m_Enabled;
|
||||
|
||||
private string m_fetchInventoryDescendents2Url;
|
||||
private string m_webFetchInventoryDescendentsUrl;
|
||||
|
||||
private WebFetchInvDescHandler m_webFetchHandler;
|
||||
|
||||
private ManualResetEvent m_ev = new ManualResetEvent(true);
|
||||
private object m_lock = new object();
|
||||
|
||||
private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>();
|
||||
private Dictionary<UUID, Hashtable> m_requests = new Dictionary<UUID, Hashtable>();
|
||||
|
||||
#region ISharedRegionModule Members
|
||||
|
||||
public void Initialise(IConfigSource source)
|
||||
{
|
||||
IConfig config = source.Configs["ClientStack.LindenCaps"];
|
||||
if (config == null)
|
||||
return;
|
||||
|
||||
m_fetchInventoryDescendents2Url = config.GetString("Cap_FetchInventoryDescendents2", string.Empty);
|
||||
m_webFetchInventoryDescendentsUrl = config.GetString("Cap_WebFetchInventoryDescendents", string.Empty);
|
||||
|
||||
if (m_fetchInventoryDescendents2Url != string.Empty || m_webFetchInventoryDescendentsUrl != string.Empty)
|
||||
{
|
||||
m_Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddRegion(Scene s)
|
||||
{
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
m_scene = s;
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene s)
|
||||
{
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
|
||||
m_scene.EventManager.OnDeregisterCaps -= DeregisterCaps;
|
||||
m_scene = null;
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene s)
|
||||
{
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
m_InventoryService = m_scene.InventoryService;
|
||||
m_LibraryService = m_scene.LibraryService;
|
||||
|
||||
// We'll reuse the same handler for all requests.
|
||||
if (m_fetchInventoryDescendents2Url == "localhost" || m_webFetchInventoryDescendentsUrl == "localhost")
|
||||
m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService);
|
||||
m_webFetchHandler = new WebFetchInvDescHandler(m_InventoryService, m_LibraryService);
|
||||
|
||||
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
|
||||
m_scene.EventManager.OnDeregisterCaps += DeregisterCaps;
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
|
@ -128,41 +113,110 @@ namespace OpenSim.Region.ClientStack.Linden
|
|||
|
||||
private void RegisterCaps(UUID agentID, Caps caps)
|
||||
{
|
||||
if (m_webFetchInventoryDescendentsUrl != "")
|
||||
RegisterFetchCap(agentID, caps, "WebFetchInventoryDescendents", m_webFetchInventoryDescendentsUrl);
|
||||
string capUrl = "/CAPS/" + UUID.Random() + "/";
|
||||
|
||||
if (m_fetchInventoryDescendents2Url != "")
|
||||
RegisterFetchCap(agentID, caps, "FetchInventoryDescendents2", m_fetchInventoryDescendents2Url);
|
||||
// Register this as a poll service
|
||||
PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, agentID, 300000);
|
||||
args.Type = PollServiceEventArgs.EventType.Inventory;
|
||||
MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
|
||||
|
||||
string hostName = m_scene.RegionInfo.ExternalHostName;
|
||||
uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port;
|
||||
string protocol = "http";
|
||||
|
||||
if (MainServer.Instance.UseSSL)
|
||||
{
|
||||
hostName = MainServer.Instance.SSLCommonName;
|
||||
port = MainServer.Instance.SSLPort;
|
||||
protocol = "https";
|
||||
}
|
||||
caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
|
||||
|
||||
m_capsDict[agentID] = capUrl;
|
||||
}
|
||||
|
||||
private void RegisterFetchCap(UUID agentID, Caps caps, string capName, string url)
|
||||
private void DeregisterCaps(UUID agentID, Caps caps)
|
||||
{
|
||||
string capUrl;
|
||||
|
||||
if (url == "localhost")
|
||||
if (m_capsDict.TryGetValue(agentID, out capUrl))
|
||||
{
|
||||
capUrl = "/CAPS/" + UUID.Random();
|
||||
|
||||
IRequestHandler reqHandler
|
||||
= new RestStreamHandler(
|
||||
"POST",
|
||||
capUrl,
|
||||
m_webFetchHandler.FetchInventoryDescendentsRequest,
|
||||
"FetchInventoryDescendents2",
|
||||
agentID.ToString());
|
||||
|
||||
caps.RegisterHandler(capName, reqHandler);
|
||||
MainServer.Instance.RemoveHTTPHandler("", capUrl);
|
||||
m_capsDict.Remove(agentID);
|
||||
}
|
||||
else
|
||||
{
|
||||
capUrl = url;
|
||||
}
|
||||
|
||||
caps.RegisterHandler(capName, capUrl);
|
||||
public void HttpRequestHandler(UUID requestID, Hashtable request)
|
||||
{
|
||||
// m_log.DebugFormat("[FETCH2]: Received request {0}", requestID);
|
||||
m_requests[requestID] = request;
|
||||
}
|
||||
|
||||
private bool HasEvents(UUID requestID, UUID sessionID)
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
if (m_ev.WaitOne(0))
|
||||
{
|
||||
m_ev.Reset();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private Hashtable NoEvents(UUID requestID, UUID sessionID)
|
||||
{
|
||||
m_requests.Remove(requestID);
|
||||
|
||||
Hashtable response = new Hashtable();
|
||||
|
||||
response["int_response_code"] = 500;
|
||||
response["str_response_string"] = "Script timeout";
|
||||
response["content_type"] = "text/plain";
|
||||
response["keepalive"] = false;
|
||||
response["reusecontext"] = false;
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
|
||||
{
|
||||
Hashtable response = new Hashtable();
|
||||
|
||||
response["int_response_code"] = 500;
|
||||
response["str_response_string"] = "Internal error";
|
||||
response["content_type"] = "text/plain";
|
||||
response["keepalive"] = false;
|
||||
response["reusecontext"] = false;
|
||||
|
||||
try
|
||||
{
|
||||
Hashtable requestHash;
|
||||
if (!m_requests.TryGetValue(requestID, out requestHash))
|
||||
{
|
||||
lock (m_lock)
|
||||
m_ev.Set();
|
||||
response["str_response_string"] = "Invalid request";
|
||||
return response;
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[FETCH2]: Processed request {0}", requestID);
|
||||
|
||||
string reply = m_webFetchHandler.FetchInventoryDescendentsRequest(requestHash["body"].ToString(), String.Empty, String.Empty, null, null);
|
||||
|
||||
m_requests.Remove(requestID);
|
||||
|
||||
response["int_response_code"] = 200;
|
||||
response["str_response_string"] = reply;
|
||||
}
|
||||
finally
|
||||
{
|
||||
lock (m_lock)
|
||||
m_ev.Set();
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[WEB FETCH INV DESC MODULE]: Registered capability {0} at {1} in region {2} for {3}",
|
||||
// capName, capUrl, m_scene.RegionInfo.RegionName, agentID);
|
||||
return response;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3809,7 +3809,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
if (part.ParentGroup.IsAttachment)
|
||||
{ // Someone else's HUD, why are we getting these?
|
||||
if (part.ParentGroup.OwnerID != AgentId &&
|
||||
part.ParentGroup.RootPart.Shape.State >= 30)
|
||||
part.ParentGroup.RootPart.Shape.State > 30)
|
||||
continue;
|
||||
ScenePresence sp;
|
||||
// Owner is not in the sim, don't update it to
|
||||
|
|
|
@ -526,10 +526,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
|
||||
public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so)
|
||||
{
|
||||
// As per Linden spec, detach (take) is disabled for temp attachs
|
||||
if (so.FromItemID == UUID.Zero)
|
||||
return;
|
||||
|
||||
lock (sp.AttachmentsSyncLock)
|
||||
{
|
||||
// Save avatar attachment information
|
||||
|
@ -1050,7 +1046,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
|
||||
SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
|
||||
|
||||
if (sp != null && group != null)
|
||||
if (sp != null && group != null && group.FromItemID != UUID.Zero)
|
||||
DetachSingleAttachmentToInv(sp, group);
|
||||
}
|
||||
|
||||
|
@ -1068,7 +1064,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
|
||||
foreach (SceneObjectGroup group in attachments)
|
||||
{
|
||||
if (group.FromItemID == itemID)
|
||||
if (group.FromItemID == itemID && group.FromItemID != UUID.Zero)
|
||||
{
|
||||
DetachSingleAttachmentToInv(sp, group);
|
||||
return;
|
||||
|
|
|
@ -1983,6 +1983,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
SceneObjectGroup grp = part.ParentGroup;
|
||||
|
||||
// If child prims have invalid perms, fix them
|
||||
grp.AdjustChildPrimPermissions();
|
||||
|
||||
if (remoteClient == null)
|
||||
{
|
||||
// Autoreturn has a null client. Nothing else does. So
|
||||
|
@ -2050,7 +2053,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (Permissions.CanReturnObjects(
|
||||
null,
|
||||
remoteClient.AgentId,
|
||||
deleteGroups))
|
||||
new List<SceneObjectGroup>() {grp}))
|
||||
{
|
||||
permissionToTake = true;
|
||||
permissionToDelete = true;
|
||||
|
|
|
@ -215,7 +215,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
private int m_update_presences = 1; // Update scene presence movements
|
||||
private int m_update_events = 1;
|
||||
private int m_update_backup = 200;
|
||||
private int m_update_terrain = 50;
|
||||
private int m_update_terrain = 1000;
|
||||
private int m_update_land = 10;
|
||||
private int m_update_coarse_locations = 50;
|
||||
|
||||
|
|
|
@ -2852,6 +2852,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// Can't do this yet since backup still makes use of the root part without any synchronization
|
||||
// objectGroup.m_rootPart = null;
|
||||
|
||||
// If linking prims with different permissions, fix them
|
||||
AdjustChildPrimPermissions();
|
||||
|
||||
AttachToBackup();
|
||||
|
||||
// Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the
|
||||
|
@ -3306,6 +3309,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <param name="SetVolumeDetect"></param>
|
||||
public void UpdatePrimFlags(uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVolumeDetect)
|
||||
{
|
||||
HasGroupChanged = true;
|
||||
|
||||
SceneObjectPart selectionPart = GetPart(localID);
|
||||
|
||||
if (SetTemporary && Scene != null)
|
||||
|
@ -3389,12 +3394,21 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public void AdjustChildPrimPermissions()
|
||||
{
|
||||
ForEachPart(part =>
|
||||
{
|
||||
if (part != RootPart)
|
||||
part.ClonePermissions(RootPart);
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdatePermissions(UUID AgentID, byte field, uint localID,
|
||||
uint mask, byte addRemTF)
|
||||
{
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
parts[i].UpdatePermissions(AgentID, field, localID, mask, addRemTF);
|
||||
RootPart.UpdatePermissions(AgentID, field, localID, mask, addRemTF);
|
||||
|
||||
AdjustChildPrimPermissions();
|
||||
|
||||
HasGroupChanged = true;
|
||||
|
||||
|
|
|
@ -4487,6 +4487,27 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
public void ClonePermissions(SceneObjectPart source)
|
||||
{
|
||||
bool update = false;
|
||||
|
||||
if (BaseMask != source.BaseMask ||
|
||||
OwnerMask != source.OwnerMask ||
|
||||
GroupMask != source.GroupMask ||
|
||||
EveryoneMask != source.EveryoneMask ||
|
||||
NextOwnerMask != source.NextOwnerMask)
|
||||
update = true;
|
||||
|
||||
BaseMask = source.BaseMask;
|
||||
OwnerMask = source.OwnerMask;
|
||||
GroupMask = source.GroupMask;
|
||||
EveryoneMask = source.EveryoneMask;
|
||||
NextOwnerMask = source.NextOwnerMask;
|
||||
|
||||
if (update)
|
||||
SendFullUpdateToAllClients();
|
||||
}
|
||||
|
||||
public bool IsHingeJoint()
|
||||
{
|
||||
// For now, we use the NINJA naming scheme for identifying joints.
|
||||
|
|
|
@ -386,6 +386,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
m_SOPXmlProcessors.Add("Friction", ProcessFriction);
|
||||
m_SOPXmlProcessors.Add("Bounce", ProcessBounce);
|
||||
m_SOPXmlProcessors.Add("GravityModifier", ProcessGravityModifier);
|
||||
m_SOPXmlProcessors.Add("CameraEyeOffset", ProcessCameraEyeOffset);
|
||||
m_SOPXmlProcessors.Add("CameraAtOffset", ProcessCameraAtOffset);
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -639,6 +641,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
obj.GravityModifier = reader.ReadElementContentAsFloat("GravityModifier", String.Empty);
|
||||
}
|
||||
|
||||
private static void ProcessCameraEyeOffset(SceneObjectPart obj, XmlTextReader reader)
|
||||
{
|
||||
obj.SetCameraEyeOffset(Util.ReadVector(reader, "CameraEyeOffset"));
|
||||
}
|
||||
|
||||
private static void ProcessCameraAtOffset(SceneObjectPart obj, XmlTextReader reader)
|
||||
{
|
||||
obj.SetCameraAtOffset(Util.ReadVector(reader, "CameraAtOffset"));
|
||||
}
|
||||
|
||||
private static void ProcessVehicle(SceneObjectPart obj, XmlTextReader reader)
|
||||
{
|
||||
SOPVehicle vehicle = SOPVehicle.FromXml2(reader);
|
||||
|
@ -1355,6 +1367,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
|||
writer.WriteElementString("Bounce", sop.Bounciness.ToString().ToLower());
|
||||
if (sop.GravityModifier != 1.0f)
|
||||
writer.WriteElementString("GravityModifier", sop.GravityModifier.ToString().ToLower());
|
||||
WriteVector(writer, "CameraEyeOffset", sop.GetCameraEyeOffset());
|
||||
WriteVector(writer, "CameraAtOffset", sop.GetCameraAtOffset());
|
||||
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
|
|
@ -6090,6 +6090,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
flags |= ScriptBaseClass.AGENT_AWAY;
|
||||
}
|
||||
|
||||
UUID busy = new UUID("efcf670c-2d18-8128-973a-034ebc806b67");
|
||||
UUID[] anims = agent.Animator.GetAnimationArray();
|
||||
if (Array.Exists<UUID>(anims, a => { return a == busy; }))
|
||||
{
|
||||
flags |= ScriptBaseClass.AGENT_BUSY;
|
||||
}
|
||||
|
||||
// seems to get unset, even if in mouselook, when avatar is sitting on a prim???
|
||||
if ((agent.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue