diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework')
3 files changed, 53 insertions, 215 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs index 75f0774..f54298c 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs | |||
@@ -35,6 +35,7 @@ using System.Xml; | |||
35 | using log4net; | 35 | using log4net; |
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Framework.Serialization.External; | ||
38 | 39 | ||
39 | using OpenSim.Region.Framework.Scenes; | 40 | using OpenSim.Region.Framework.Scenes; |
40 | using OpenSim.Region.Framework.Scenes.Serialization; | 41 | using OpenSim.Region.Framework.Scenes.Serialization; |
@@ -189,217 +190,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
189 | return Utils.StringToBytes(RewriteSOP(xml)); | 190 | return Utils.StringToBytes(RewriteSOP(xml)); |
190 | } | 191 | } |
191 | 192 | ||
192 | protected void TransformXml(XmlReader reader, XmlWriter writer) | ||
193 | { | ||
194 | // m_log.DebugFormat("[HG ASSET MAPPER]: Transforming XML"); | ||
195 | |||
196 | int sopDepth = -1; | ||
197 | UserAccount creator = null; | ||
198 | bool hasCreatorData = false; | ||
199 | |||
200 | while (reader.Read()) | ||
201 | { | ||
202 | // Console.WriteLine("Depth: {0}, name {1}", reader.Depth, reader.Name); | ||
203 | |||
204 | switch (reader.NodeType) | ||
205 | { | ||
206 | case XmlNodeType.Attribute: | ||
207 | // Console.WriteLine("FOUND ATTRIBUTE {0}", reader.Name); | ||
208 | writer.WriteAttributeString(reader.Prefix, reader.Name, reader.NamespaceURI, reader.Value); | ||
209 | break; | ||
210 | |||
211 | case XmlNodeType.CDATA: | ||
212 | writer.WriteCData(reader.Value); | ||
213 | break; | ||
214 | |||
215 | case XmlNodeType.Comment: | ||
216 | writer.WriteComment(reader.Value); | ||
217 | break; | ||
218 | |||
219 | case XmlNodeType.DocumentType: | ||
220 | writer.WriteDocType(reader.Name, reader.Value, null, null); | ||
221 | break; | ||
222 | |||
223 | case XmlNodeType.Element: | ||
224 | // m_log.DebugFormat("Depth {0} at element {1}", reader.Depth, reader.Name); | ||
225 | |||
226 | writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); | ||
227 | |||
228 | if (reader.HasAttributes) | ||
229 | { | ||
230 | while (reader.MoveToNextAttribute()) | ||
231 | writer.WriteAttributeString(reader.Prefix, reader.Name, reader.NamespaceURI, reader.Value); | ||
232 | |||
233 | reader.MoveToElement(); | ||
234 | } | ||
235 | |||
236 | if (reader.LocalName == "SceneObjectPart") | ||
237 | { | ||
238 | if (sopDepth < 0) | ||
239 | { | ||
240 | sopDepth = reader.Depth; | ||
241 | // m_log.DebugFormat("[HG ASSET MAPPER]: Set sopDepth to {0}", sopDepth); | ||
242 | } | ||
243 | } | ||
244 | else | ||
245 | { | ||
246 | if (sopDepth >= 0 && reader.Depth == sopDepth + 1) | ||
247 | { | ||
248 | if (reader.Name == "CreatorID") | ||
249 | { | ||
250 | reader.Read(); | ||
251 | if (reader.NodeType == XmlNodeType.Element && reader.Name == "Guid" || reader.Name == "UUID") | ||
252 | { | ||
253 | reader.Read(); | ||
254 | |||
255 | if (reader.NodeType == XmlNodeType.Text) | ||
256 | { | ||
257 | UUID uuid = UUID.Zero; | ||
258 | UUID.TryParse(reader.Value, out uuid); | ||
259 | creator = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, uuid); | ||
260 | writer.WriteElementString("UUID", reader.Value); | ||
261 | reader.Read(); | ||
262 | } | ||
263 | else | ||
264 | { | ||
265 | // If we unexpected run across mixed content in this node, still carry on | ||
266 | // transforming the subtree (this replicates earlier behaviour). | ||
267 | TransformXml(reader, writer); | ||
268 | } | ||
269 | } | ||
270 | else | ||
271 | { | ||
272 | // If we unexpected run across mixed content in this node, still carry on | ||
273 | // transforming the subtree (this replicates earlier behaviour). | ||
274 | TransformXml(reader, writer); | ||
275 | } | ||
276 | } | ||
277 | else if (reader.Name == "CreatorData") | ||
278 | { | ||
279 | reader.Read(); | ||
280 | if (reader.NodeType == XmlNodeType.Text) | ||
281 | { | ||
282 | hasCreatorData = true; | ||
283 | writer.WriteString(reader.Value); | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | // If we unexpected run across mixed content in this node, still carry on | ||
288 | // transforming the subtree (this replicates earlier behaviour). | ||
289 | TransformXml(reader, writer); | ||
290 | } | ||
291 | } | ||
292 | } | ||
293 | } | ||
294 | |||
295 | if (reader.IsEmptyElement) | ||
296 | { | ||
297 | // m_log.DebugFormat("[HG ASSET MAPPER]: Writing end for empty element {0}", reader.Name); | ||
298 | writer.WriteEndElement(); | ||
299 | } | ||
300 | |||
301 | break; | ||
302 | |||
303 | case XmlNodeType.EndElement: | ||
304 | // m_log.DebugFormat("Depth {0} at EndElement", reader.Depth); | ||
305 | if (sopDepth == reader.Depth) | ||
306 | { | ||
307 | if (!hasCreatorData && creator != null) | ||
308 | writer.WriteElementString(reader.Prefix, "CreatorData", reader.NamespaceURI, string.Format("{0};{1} {2}", m_HomeURI, creator.FirstName, creator.LastName)); | ||
309 | |||
310 | // m_log.DebugFormat("[HG ASSET MAPPER]: Reset sopDepth"); | ||
311 | sopDepth = -1; | ||
312 | creator = null; | ||
313 | hasCreatorData = false; | ||
314 | } | ||
315 | writer.WriteEndElement(); | ||
316 | break; | ||
317 | |||
318 | case XmlNodeType.EntityReference: | ||
319 | writer.WriteEntityRef(reader.Name); | ||
320 | break; | ||
321 | |||
322 | case XmlNodeType.ProcessingInstruction: | ||
323 | writer.WriteProcessingInstruction(reader.Name, reader.Value); | ||
324 | break; | ||
325 | |||
326 | case XmlNodeType.Text: | ||
327 | writer.WriteString(reader.Value); | ||
328 | break; | ||
329 | |||
330 | case XmlNodeType.XmlDeclaration: | ||
331 | // For various reasons, not all serializations have xml declarations (or consistent ones) | ||
332 | // and as it's embedded inside a byte stream we don't need it anyway, so ignore. | ||
333 | break; | ||
334 | |||
335 | default: | ||
336 | m_log.WarnFormat( | ||
337 | "[HG ASSET MAPPER]: Unrecognized node {0} in asset XML transform in {1}", | ||
338 | reader.NodeType, m_scene.Name); | ||
339 | break; | ||
340 | } | ||
341 | } | ||
342 | } | ||
343 | |||
344 | protected string RewriteSOP(string xmlData) | 193 | protected string RewriteSOP(string xmlData) |
345 | { | 194 | { |
346 | // Console.WriteLine("Input XML [{0}]", xmlData); | 195 | // Console.WriteLine("Input XML [{0}]", xmlData); |
196 | return ExternalRepresentationUtils.RewriteSOP(xmlData, m_scene.Name, m_HomeURI, m_scene.UserAccountService, m_scene.RegionInfo.ScopeID); | ||
347 | 197 | ||
348 | using (StringWriter sw = new StringWriter()) | ||
349 | using (XmlTextWriter writer = new XmlTextWriter(sw)) | ||
350 | using (XmlTextReader wrappedReader = new XmlTextReader(xmlData, XmlNodeType.Element, null)) | ||
351 | using (XmlReader reader = XmlReader.Create(wrappedReader, new XmlReaderSettings() { IgnoreWhitespace = true, ConformanceLevel = ConformanceLevel.Fragment })) | ||
352 | { | ||
353 | TransformXml(reader, writer); | ||
354 | |||
355 | // Console.WriteLine("Output: [{0}]", sw.ToString()); | ||
356 | |||
357 | return sw.ToString(); | ||
358 | } | ||
359 | |||
360 | // We are now taking the more complex streaming approach above because some assets can be very large | ||
361 | // and can trigger higher CPU use or possibly memory problems. | ||
362 | // XmlDocument doc = new XmlDocument(); | ||
363 | // doc.LoadXml(xml); | ||
364 | // XmlNodeList sops = doc.GetElementsByTagName("SceneObjectPart"); | ||
365 | // | ||
366 | // foreach (XmlNode sop in sops) | ||
367 | // { | ||
368 | // UserAccount creator = null; | ||
369 | // bool hasCreatorData = false; | ||
370 | // XmlNodeList nodes = sop.ChildNodes; | ||
371 | // foreach (XmlNode node in nodes) | ||
372 | // { | ||
373 | // if (node.Name == "CreatorID") | ||
374 | // { | ||
375 | // UUID uuid = UUID.Zero; | ||
376 | // UUID.TryParse(node.InnerText, out uuid); | ||
377 | // creator = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, uuid); | ||
378 | // } | ||
379 | // if (node.Name == "CreatorData" && node.InnerText != null && node.InnerText != string.Empty) | ||
380 | // hasCreatorData = true; | ||
381 | // | ||
382 | // //if (node.Name == "OwnerID") | ||
383 | // //{ | ||
384 | // // UserAccount owner = GetUser(node.InnerText); | ||
385 | // // if (owner != null) | ||
386 | // // node.InnerText = m_ProfileServiceURL + "/" + node.InnerText + "/" + owner.FirstName + " " + owner.LastName; | ||
387 | // //} | ||
388 | // } | ||
389 | // | ||
390 | // if (!hasCreatorData && creator != null) | ||
391 | // { | ||
392 | // XmlElement creatorData = doc.CreateElement("CreatorData"); | ||
393 | // creatorData.InnerText = m_HomeURI + ";" + creator.FirstName + " " + creator.LastName; | ||
394 | // sop.AppendChild(creatorData); | ||
395 | // } | ||
396 | // } | ||
397 | // | ||
398 | // using (StringWriter wr = new StringWriter()) | ||
399 | // { | ||
400 | // doc.Save(wr); | ||
401 | // return wr.ToString(); | ||
402 | // } | ||
403 | } | 198 | } |
404 | 199 | ||
405 | // TODO: unused | 200 | // TODO: unused |
diff --git a/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs index 01814a1..e657f53 100644 --- a/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs +++ b/OpenSim/Region/CoreModules/Framework/Library/LocalInventoryService.cs | |||
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
65 | { | 65 | { |
66 | InventoryFolderImpl folder = null; | 66 | InventoryFolderImpl folder = null; |
67 | InventoryCollection inv = new InventoryCollection(); | 67 | InventoryCollection inv = new InventoryCollection(); |
68 | inv.UserID = m_Library.Owner; | 68 | inv.OwnerID = m_Library.Owner; |
69 | 69 | ||
70 | if (folderID != m_Library.ID) | 70 | if (folderID != m_Library.ID) |
71 | { | 71 | { |
@@ -87,6 +87,34 @@ namespace OpenSim.Region.CoreModules.Framework.Library | |||
87 | return inv; | 87 | return inv; |
88 | } | 88 | } |
89 | 89 | ||
90 | public virtual InventoryCollection[] GetMultipleFoldersContent(UUID principalID, UUID[] folderIDs) | ||
91 | { | ||
92 | InventoryCollection[] invColl = new InventoryCollection[folderIDs.Length]; | ||
93 | int i = 0; | ||
94 | foreach (UUID fid in folderIDs) | ||
95 | { | ||
96 | invColl[i++] = GetFolderContent(principalID, fid); | ||
97 | } | ||
98 | |||
99 | return invColl; | ||
100 | } | ||
101 | |||
102 | public virtual InventoryItemBase[] GetMultipleItems(UUID principalID, UUID[] itemIDs) | ||
103 | { | ||
104 | InventoryItemBase[] itemColl = new InventoryItemBase[itemIDs.Length]; | ||
105 | int i = 0; | ||
106 | InventoryItemBase item = new InventoryItemBase(); | ||
107 | item.Owner = principalID; | ||
108 | foreach (UUID fid in itemIDs) | ||
109 | { | ||
110 | item.ID = fid; | ||
111 | itemColl[i++] = GetItem(item); | ||
112 | } | ||
113 | |||
114 | return itemColl; | ||
115 | } | ||
116 | |||
117 | |||
90 | /// <summary> | 118 | /// <summary> |
91 | /// Add a new folder to the user's inventory | 119 | /// Add a new folder to the user's inventory |
92 | /// </summary> | 120 | /// </summary> |
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index ba71dc5..7ecbd26 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs | |||
@@ -154,7 +154,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
154 | 154 | ||
155 | #endregion ISharedRegionModule | 155 | #endregion ISharedRegionModule |
156 | 156 | ||
157 | 157 | ||
158 | #region Event Handlers | 158 | #region Event Handlers |
159 | 159 | ||
160 | void EventManager_OnPrimsLoaded(Scene s) | 160 | void EventManager_OnPrimsLoaded(Scene s) |
@@ -180,7 +180,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
180 | void HandleUUIDNameRequest(UUID uuid, IClientAPI client) | 180 | void HandleUUIDNameRequest(UUID uuid, IClientAPI client) |
181 | { | 181 | { |
182 | // m_log.DebugFormat( | 182 | // m_log.DebugFormat( |
183 | // "[USER MANAGEMENT MODULE]: Handling request for name binding of UUID {0} from {1}", | 183 | // "[USER MANAGEMENT MODULE]: Handling request for name binding of UUID {0} from {1}", |
184 | // uuid, remote_client.Name); | 184 | // uuid, remote_client.Name); |
185 | 185 | ||
186 | if (m_Scenes[0].LibraryService != null && (m_Scenes[0].LibraryService.LibraryRootFolder.Owner == uuid)) | 186 | if (m_Scenes[0].LibraryService != null && (m_Scenes[0].LibraryService.LibraryRootFolder.Owner == uuid)) |
@@ -212,7 +212,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
212 | // appear to clear this when the user asks it to clear the cache, but others may not. | 212 | // appear to clear this when the user asks it to clear the cache, but others may not. |
213 | // | 213 | // |
214 | // So to avoid clients | 214 | // So to avoid clients |
215 | // (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will | 215 | // (particularly Hypergrid clients) permanently binding "Unknown User" to a given UUID, we will |
216 | // instead drop the request entirely. | 216 | // instead drop the request entirely. |
217 | if (GetUser(uuid, out user)) | 217 | if (GetUser(uuid, out user)) |
218 | { | 218 | { |
@@ -220,7 +220,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
220 | } | 220 | } |
221 | // else | 221 | // else |
222 | // m_log.DebugFormat( | 222 | // m_log.DebugFormat( |
223 | // "[USER MANAGEMENT MODULE]: No bound name for {0} found, ignoring request from {1}", | 223 | // "[USER MANAGEMENT MODULE]: No bound name for {0} found, ignoring request from {1}", |
224 | // uuid, client.Name); | 224 | // uuid, client.Name); |
225 | }); | 225 | }); |
226 | } | 226 | } |
@@ -416,7 +416,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
416 | m_log.Debug("[USER MANAGEMENT MODULE]: GetServerURLs call failed ", e); | 416 | m_log.Debug("[USER MANAGEMENT MODULE]: GetServerURLs call failed ", e); |
417 | userdata.ServerURLs = new Dictionary<string, object>(); | 417 | userdata.ServerURLs = new Dictionary<string, object>(); |
418 | } | 418 | } |
419 | 419 | ||
420 | if (userdata.ServerURLs != null && userdata.ServerURLs.ContainsKey(serverType) && userdata.ServerURLs[serverType] != null) | 420 | if (userdata.ServerURLs != null && userdata.ServerURLs.ContainsKey(serverType) && userdata.ServerURLs[serverType] != null) |
421 | return userdata.ServerURLs[serverType].ToString(); | 421 | return userdata.ServerURLs[serverType].ToString(); |
422 | } | 422 | } |
@@ -620,7 +620,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
620 | AddUser(id, string.Empty, string.Empty, string.Empty); | 620 | AddUser(id, string.Empty, string.Empty, string.Empty); |
621 | } | 621 | } |
622 | else | 622 | else |
623 | { | 623 | { |
624 | string homeURL; | 624 | string homeURL; |
625 | string firstname = string.Empty; | 625 | string firstname = string.Empty; |
626 | string lastname = string.Empty; | 626 | string lastname = string.Empty; |
@@ -676,7 +676,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
676 | else | 676 | else |
677 | { | 677 | { |
678 | lock(m_UserCache) | 678 | lock(m_UserCache) |
679 | { | 679 | { |
680 | if(!m_UserCache.ContainsKey(id)) | 680 | if(!m_UserCache.ContainsKey(id)) |
681 | { | 681 | { |
682 | UserData newUser = new UserData(); | 682 | UserData newUser = new UserData(); |
@@ -726,6 +726,21 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
726 | "Show the bindings between user UUIDs and user names", | 726 | "Show the bindings between user UUIDs and user names", |
727 | String.Empty, | 727 | String.Empty, |
728 | HandleShowUsers); | 728 | HandleShowUsers); |
729 | |||
730 | MainConsole.Instance.Commands.AddCommand("Users", true, | ||
731 | "reset user cache", | ||
732 | "reset user cache", | ||
733 | "reset user cache to allow changed settings to be applied", | ||
734 | String.Empty, | ||
735 | HandleResetUserCache); | ||
736 | } | ||
737 | |||
738 | private void HandleResetUserCache(string module, string[] cmd) | ||
739 | { | ||
740 | lock(m_UserCache) | ||
741 | { | ||
742 | m_UserCache.Clear(); | ||
743 | } | ||
729 | } | 744 | } |
730 | 745 | ||
731 | private void HandleShowUser(string module, string[] cmd) | 746 | private void HandleShowUser(string module, string[] cmd) |