From bf7e7b2c57d9b1d7d00f76bbae41093eaf267921 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 16 Apr 2008 03:55:21 +0000 Subject: Thank you very much, Kmeisthax for: This patch makes the "Show in Search" checkbox on the viewer work. Additionally, I also discovered that show-in-search objects use the JointWheel flag, so this patch currently uses that flag. LibSL needs to add a flag to enum LLObject.ObjectFlags, "IncludeSearch = 32768" so we aren't using a legacy flag. Additionally this patch also contains a small fix to BaseHTTPServer that lets the response content-type to be something other than text/html. For some reason this didn't get submitted with the DataSnapshot merge. --- OpenSim/Framework/IClientAPI.cs | 4 +- OpenSim/Framework/Servers/BaseHttpServer.cs | 15 +++++++- OpenSim/Region/ClientStack/ClientView.cs | 18 +++++++++ OpenSim/Region/Environment/Scenes/InnerScene.cs | 44 ++++++++++++++++++++++ OpenSim/Region/Environment/Scenes/Scene.cs | 2 + .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 2 + 6 files changed, 82 insertions(+), 3 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index cd59fa0..c0f7fce 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -435,6 +435,8 @@ namespace OpenSim.Framework public delegate void EconomyDataRequest(LLUUID agentID); + public delegate void ObjectIncludeInSearch(IClientAPI remoteClient, bool IncludeInSearch, uint localID); + public interface IClientAPI { event ImprovedInstantMessage OnInstantMessage; @@ -549,7 +551,7 @@ namespace OpenSim.Framework event UpdateAvatarProperties OnUpdateAvatarProperties; event ParcelBuy OnParcelBuy; - + event ObjectIncludeInSearch OnObjectIncludeInSearch; LLVector3 StartPos { get; set; } diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 0baddb8..de15923 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -440,6 +440,7 @@ namespace OpenSim.Framework.Servers string[] querystringkeys = request.QueryString.AllKeys; string[] rHeaders = request.Headers.AllKeys; + foreach (string queryname in querystringkeys) { keysvals.Add(queryname, request.QueryString[queryname]); @@ -487,7 +488,16 @@ namespace OpenSim.Framework.Servers { int responsecode = (int)responsedata["int_response_code"]; string responseString = (string)responsedata["str_response_string"]; - + string contentType = (string)responsedata["content_type"]; + + //Even though only one other part of the entire code uses HTTPHandlers, we shouldn't expect this + //and should check for NullReferenceExceptions + + if (contentType == null || contentType == "") + { + contentType = "text/html"; + } + // We're forgoing the usual error status codes here because the client // ignores anything but 200 and 301 @@ -498,7 +508,8 @@ namespace OpenSim.Framework.Servers response.RedirectLocation = (string)responsedata["str_redirect_location"]; response.StatusCode = responsecode; } - response.AddHeader("Content-type", "text/html"); + + response.AddHeader("Content-type", contentType); byte[] buffer = Encoding.UTF8.GetBytes(responseString); diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index f065bae..dba5b38 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -163,6 +163,7 @@ namespace OpenSim.Region.ClientStack private ObjectDuplicateOnRay handlerObjectDuplicateOnRay = null; private ObjectSelect handlerObjectSelect = null; private ObjectDeselect handlerObjectDeselect = null; + private ObjectIncludeInSearch handlerObjectIncludeInSearch = null; private UpdatePrimFlags handlerUpdatePrimFlags = null; //OnUpdatePrimFlags; private UpdatePrimTexture handlerUpdatePrimTexture = null; private UpdateVector handlerGrabObject = null; //OnGrabObject; @@ -699,6 +700,7 @@ namespace OpenSim.Region.ClientStack public event ObjectDeselect OnObjectDeselect; public event GenericCall7 OnObjectDescription; public event GenericCall7 OnObjectName; + public event ObjectIncludeInSearch OnObjectIncludeInSearch; public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; public event UpdatePrimFlags OnUpdatePrimFlags; public event UpdatePrimTexture OnUpdatePrimTexture; @@ -3791,6 +3793,22 @@ namespace OpenSim.Region.ClientStack } break; + case PacketType.ObjectIncludeInSearch: + //This lets us set objects to appear in search (stuff like DataSnapshot, etc) + ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack; + handlerObjectIncludeInSearch = null; + + foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData) { + bool inSearch = objData.IncludeInSearch; + uint localID = objData.ObjectLocalID; + + handlerObjectIncludeInSearch = OnObjectIncludeInSearch; + + if (handlerObjectIncludeInSearch != null) { + handlerObjectIncludeInSearch(this, inSearch, localID); + } + } + break; #endregion diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 0838387..ea4283f 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -1236,6 +1236,50 @@ namespace OpenSim.Region.Environment.Scenes } } + public void MakeObjectSearchable(IClientAPI remoteClient, bool IncludeInSearch, uint localID) + { + LLUUID user = remoteClient.AgentId; + LLUUID objid = null; + SceneObjectPart obj = null; + + List EntityList = GetEntities(); + foreach (EntityBase ent in EntityList) + { + if (ent is SceneObjectGroup) + { + foreach (KeyValuePair subent in ((SceneObjectGroup)ent).Children) + { + if (subent.Value.LocalId == localID) + { + objid = subent.Key; + obj = subent.Value; + } + } + } + } + + //Protip: In my day, we didn't call them searchable objects, we called them limited point-to-point joints + //aka ObjectFlags.JointWheel = IncludeInSearch + + //Permissions model: Object can be REMOVED from search IFF: + // * User owns object + //use CanEditObject + + //Object can be ADDED to search IFF: + // * User owns object + // * Asset/DRM permission bit "modify" is enabled + //use CanEditObjectPosition + + if (IncludeInSearch && PermissionsMngr.CanEditObject(user, objid)) + { + obj.AddFlag(LLObject.ObjectFlags.JointWheel); + } + else if (!IncludeInSearch && PermissionsMngr.CanEditObjectPosition(user, objid)) + { + obj.RemFlag(LLObject.ObjectFlags.JointWheel); + } + } + /// /// Duplicate the given object. /// diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 957c75c..464926d 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1578,6 +1578,8 @@ namespace OpenSim.Region.Environment.Scenes client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; client.OnPacketStats += AddPacketStats; + client.OnObjectIncludeInSearch += m_innerScene.MakeObjectSearchable; + EventManager.TriggerOnNewClient(client); } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 23b3015..d5dc937 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -161,6 +161,8 @@ namespace OpenSim.Region.Examples.SimpleModule public event MoneyBalanceRequest OnMoneyBalanceRequest; public event UpdateAvatarProperties OnUpdateAvatarProperties; + public event ObjectIncludeInSearch OnObjectIncludeInSearch; + #pragma warning restore 67 -- cgit v1.1