diff options
author | Charles Krinke | 2008-05-17 15:47:08 +0000 |
---|---|---|
committer | Charles Krinke | 2008-05-17 15:47:08 +0000 |
commit | f6a4f8844f01fb756bbc26d65c252fc07ab8c2bf (patch) | |
tree | da27e199a03ec4afd829a3ab9b06deab47cd02a3 /OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | |
parent | while this doesn't fix the initial no pants issue in grid (which still baffle... (diff) | |
download | opensim-SC-f6a4f8844f01fb756bbc26d65c252fc07ab8c2bf.zip opensim-SC-f6a4f8844f01fb756bbc26d65c252fc07ab8c2bf.tar.gz opensim-SC-f6a4f8844f01fb756bbc26d65c252fc07ab8c2bf.tar.bz2 opensim-SC-f6a4f8844f01fb756bbc26d65c252fc07ab8c2bf.tar.xz |
Thank you very much KMeisthax for DataSnapshot 1.1
to enhance search capability on OpenSim sims using
external search engines such as Metaversink.com and
others.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | 134 |
1 files changed, 100 insertions, 34 deletions
diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index 3270c3a..af73ba0 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | |||
@@ -25,24 +25,63 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
28 | using System.Reflection; | 30 | using System.Reflection; |
29 | using System.Xml; | 31 | using System.Xml; |
30 | using log4net; | 32 | using log4net; |
31 | using OpenSim.Region.DataSnapshot.Interfaces; | 33 | using OpenSim.Region.DataSnapshot.Interfaces; |
32 | using OpenSim.Region.Environment.Scenes; | 34 | using OpenSim.Region.Environment.Scenes; |
35 | using OpenSim.Framework; | ||
36 | using libsecondlife; | ||
33 | 37 | ||
34 | namespace OpenSim.Region.DataSnapshot | 38 | namespace OpenSim.Region.DataSnapshot.Providers |
35 | { | 39 | { |
36 | public class ObjectSnapshot : IDataSnapshotProvider | 40 | public class ObjectSnapshot : IDataSnapshotProvider |
37 | { | 41 | { |
38 | private Scene m_scene = null; | 42 | private Scene m_scene = null; |
39 | private DataSnapshotManager m_parent = null; | 43 | private DataSnapshotManager m_parent = null; |
40 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | private bool m_stale = true; | ||
41 | 46 | ||
42 | public void Initialize(Scene scene, DataSnapshotManager parent) | 47 | public void Initialize(Scene scene, DataSnapshotManager parent) |
43 | { | 48 | { |
44 | m_scene = scene; | 49 | m_scene = scene; |
45 | m_parent = parent; | 50 | m_parent = parent; |
51 | |||
52 | //To check for staleness, we must catch all incoming client packets. | ||
53 | m_scene.EventManager.OnNewClient += OnNewClient; | ||
54 | m_scene.EventManager.OnParcelPrimCountAdd += delegate(SceneObjectGroup obj) { this.Stale = true; }; | ||
55 | } | ||
56 | |||
57 | public void OnNewClient(IClientAPI client) | ||
58 | { | ||
59 | //Detect object data changes by hooking into the IClientAPI. | ||
60 | //Very dirty, and breaks whenever someone changes the client API. | ||
61 | |||
62 | client.OnAddPrim += delegate (LLUUID ownerID, LLVector3 RayEnd, LLQuaternion rot, | ||
63 | PrimitiveBaseShape shape, byte bypassRaycast, LLVector3 RayStart, LLUUID RayTargetID, | ||
64 | byte RayEndIsIntersection) { this.Stale = true; }; | ||
65 | client.OnLinkObjects += delegate (IClientAPI remoteClient, uint parent, List<uint> children) | ||
66 | { this.Stale = true; }; | ||
67 | client.OnDelinkObjects += delegate(List<uint> primIds) { this.Stale = true; }; | ||
68 | client.OnGrabUpdate += delegate(LLUUID objectID, LLVector3 offset, LLVector3 grapPos, | ||
69 | IClientAPI remoteClient) { this.Stale = true; }; | ||
70 | client.OnObjectAttach += delegate(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, | ||
71 | LLQuaternion rot) { this.Stale = true; }; | ||
72 | client.OnObjectDuplicate += delegate(uint localID, LLVector3 offset, uint dupeFlags, LLUUID AgentID, | ||
73 | LLUUID GroupID) { this.Stale = true; }; | ||
74 | client.OnObjectDuplicateOnRay += delegate(uint localID, uint dupeFlags, LLUUID AgentID, LLUUID GroupID, | ||
75 | LLUUID RayTargetObj, LLVector3 RayEnd, LLVector3 RayStart, bool BypassRaycast, | ||
76 | bool RayEndIsIntersection, bool CopyCenters, bool CopyRotates) { this.Stale = true; }; | ||
77 | client.OnObjectIncludeInSearch += delegate(IClientAPI remoteClient, bool IncludeInSearch, uint localID) | ||
78 | { this.Stale = true; }; | ||
79 | client.OnObjectPermissions += delegate(IClientAPI controller, LLUUID agentID, LLUUID sessionID, | ||
80 | byte field, uint localId, uint mask, byte set) { this.Stale = true; }; | ||
81 | client.OnRezObject += delegate(IClientAPI remoteClient, LLUUID itemID, LLVector3 RayEnd, | ||
82 | LLVector3 RayStart, LLUUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
83 | uint EveryoneMask, uint GroupMask, uint NextOwnerMask, uint ItemFlags, bool RezSelected, | ||
84 | bool RemoveItem, LLUUID fromTaskID) { this.Stale = true; }; | ||
46 | } | 85 | } |
47 | 86 | ||
48 | public Scene GetParentScene | 87 | public Scene GetParentScene |
@@ -52,56 +91,83 @@ namespace OpenSim.Region.DataSnapshot | |||
52 | 91 | ||
53 | public XmlNode RequestSnapshotData(XmlDocument nodeFactory) | 92 | public XmlNode RequestSnapshotData(XmlDocument nodeFactory) |
54 | { | 93 | { |
94 | m_log.Debug("[DATASNAPSHOT]: Generating object data for scene " + m_scene.RegionInfo.RegionName); | ||
95 | |||
55 | XmlNode parent = nodeFactory.CreateNode(XmlNodeType.Element, "objectdata", ""); | 96 | XmlNode parent = nodeFactory.CreateNode(XmlNodeType.Element, "objectdata", ""); |
56 | XmlNode node; | 97 | XmlNode node; |
57 | #if LIBSL_IS_FIXED | 98 | |
58 | foreach (EntityBase entity in m_scene.Entities.Values) | 99 | foreach (EntityBase entity in m_scene.Entities.Values) |
59 | { | 100 | { |
60 | // only objects, not avatars | 101 | // only objects, not avatars |
61 | if (entity is SceneObjectGroup) | 102 | if (entity is SceneObjectGroup) |
62 | { | 103 | { |
63 | SceneObjectGroup obj = (SceneObjectGroup)entity; | 104 | SceneObjectGroup obj = (SceneObjectGroup)entity; |
64 | 105 | ||
65 | XmlNode xmlobject = nodeFactory.CreateNode(XmlNodeType.Element, "object", ""); | 106 | m_log.Debug("[DATASNAPSHOT]: Found object " + obj.Name + " in scene"); |
66 | 107 | ||
67 | node = nodeFactory.CreateNode(XmlNodeType.Element, "uuid", ""); | 108 | if ((obj.RootPart.Flags & LLObject.ObjectFlags.JointWheel) == LLObject.ObjectFlags.JointWheel) { |
68 | node.InnerText = obj.UUID.ToString(); | 109 | XmlNode xmlobject = nodeFactory.CreateNode(XmlNodeType.Element, "object", ""); |
69 | xmlobject.AppendChild(node); | ||
70 | 110 | ||
71 | SceneObjectPart m_rootPart = null; | 111 | node = nodeFactory.CreateNode(XmlNodeType.Element, "uuid", ""); |
72 | try | 112 | node.InnerText = obj.UUID.ToString(); |
73 | { | ||
74 | Type sog = typeof(SceneObjectGroup); | ||
75 | FieldInfo rootField = sog.GetField("m_rootPart", BindingFlags.NonPublic | BindingFlags.Instance); | ||
76 | if (rootField != null) | ||
77 | { | ||
78 | m_rootPart = (SceneObjectPart)rootField.GetValue(obj); | ||
79 | } | ||
80 | } | ||
81 | catch (Exception e) | ||
82 | { | ||
83 | Console.WriteLine("[DATASNAPSHOT] couldn't access field reflectively\n" + e.ToString()); | ||
84 | } | ||
85 | if (m_rootPart != null) | ||
86 | { | ||
87 | node = nodeFactory.CreateNode(XmlNodeType.Element, "title", ""); | ||
88 | node.InnerText = m_rootPart.Name; | ||
89 | xmlobject.AppendChild(node); | 113 | xmlobject.AppendChild(node); |
90 | 114 | ||
91 | node = nodeFactory.CreateNode(XmlNodeType.Element, "description", ""); | 115 | SceneObjectPart m_rootPart = null; |
92 | node.InnerText = m_rootPart.Description; | 116 | try |
93 | xmlobject.AppendChild(node); | 117 | { |
118 | Type sog = typeof(SceneObjectGroup); | ||
119 | FieldInfo rootField = sog.GetField("m_rootPart", BindingFlags.NonPublic | BindingFlags.Instance); | ||
120 | if (rootField != null) | ||
121 | { | ||
122 | m_rootPart = (SceneObjectPart)rootField.GetValue(obj); | ||
123 | } | ||
124 | } | ||
125 | catch (Exception e) | ||
126 | { | ||
127 | Console.WriteLine("[DATASNAPSHOT] couldn't access field reflectively\n" + e.ToString()); | ||
128 | } | ||
129 | if (m_rootPart != null) | ||
130 | { | ||
131 | node = nodeFactory.CreateNode(XmlNodeType.Element, "title", ""); | ||
132 | node.InnerText = m_rootPart.Name; | ||
133 | xmlobject.AppendChild(node); | ||
94 | 134 | ||
95 | node = nodeFactory.CreateNode(XmlNodeType.Element, "flags", ""); | 135 | node = nodeFactory.CreateNode(XmlNodeType.Element, "description", ""); |
96 | node.InnerText = String.Format("{0:x}", m_rootPart.ObjectFlags); | 136 | node.InnerText = m_rootPart.Description; |
97 | xmlobject.AppendChild(node); | 137 | xmlobject.AppendChild(node); |
138 | |||
139 | node = nodeFactory.CreateNode(XmlNodeType.Element, "flags", ""); | ||
140 | node.InnerText = String.Format("{0:x}", m_rootPart.ObjectFlags); | ||
141 | xmlobject.AppendChild(node); | ||
142 | } | ||
143 | parent.AppendChild(xmlobject); | ||
98 | } | 144 | } |
99 | parent.AppendChild(xmlobject); | ||
100 | } | 145 | } |
101 | } | 146 | } |
102 | #endif | 147 | this.Stale = false; |
103 | return parent; | 148 | return parent; |
149 | } | ||
104 | 150 | ||
151 | public String Name | ||
152 | { | ||
153 | get { return "ObjectSnapshot"; } | ||
105 | } | 154 | } |
155 | |||
156 | public bool Stale | ||
157 | { | ||
158 | get | ||
159 | { | ||
160 | return m_stale; | ||
161 | } | ||
162 | set | ||
163 | { | ||
164 | m_stale = value; | ||
165 | |||
166 | if (m_stale) | ||
167 | OnStale(this); | ||
168 | } | ||
169 | } | ||
170 | |||
171 | public event ProviderStale OnStale; | ||
106 | } | 172 | } |
107 | } | 173 | } \ No newline at end of file |