From 5fd94111434c2faa742d4eb7357d7a6b02253988 Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Mon, 18 Nov 2013 12:48:23 +0200
Subject: Refactored Load IAR: created a generic mechanism to modify the SOG's
as they are being loaded
Resolves http://opensimulator.org/mantis/view.php?id=6942
---
.../Scenes/Serialization/SceneObjectSerializer.cs | 67 ++++++++++++++++++++++
1 file changed, 67 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 4deca00..a93f3c8 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -299,6 +299,73 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
}
}
+
+ ///
+ /// Modifies a SceneObjectGroup.
+ ///
+ /// The object
+ /// Whether the object was actually modified
+ public delegate bool SceneObjectModifier(SceneObjectGroup sog);
+
+ ///
+ /// Modifies an object by deserializing it; applying 'modifier' to each SceneObjectGroup; and reserializing.
+ ///
+ /// The object's UUID
+ /// Serialized data
+ /// The function to run on each SceneObjectGroup
+ /// The new serialized object's data, or null if an error occurred
+ public static byte[] ModifySerializedObject(UUID assetId, byte[] data, SceneObjectModifier modifier)
+ {
+ List sceneObjects = new List();
+ CoalescedSceneObjects coa = null;
+
+ string xmlData = Utils.BytesToString(data);
+
+ if (CoalescedSceneObjectsSerializer.TryFromXml(xmlData, out coa))
+ {
+ // m_log.DebugFormat("[SERIALIZER]: Loaded coalescence {0} has {1} objects", assetId, coa.Count);
+
+ if (coa.Objects.Count == 0)
+ {
+ m_log.WarnFormat("[SERIALIZER]: Aborting load of coalesced object from asset {0} as it has zero loaded components", assetId);
+ return null;
+ }
+
+ sceneObjects.AddRange(coa.Objects);
+ }
+ else
+ {
+ SceneObjectGroup deserializedObject = FromOriginalXmlFormat(xmlData);
+
+ if (deserializedObject != null)
+ {
+ sceneObjects.Add(deserializedObject);
+ }
+ else
+ {
+ m_log.WarnFormat("[SERIALIZER]: Aborting load of object from asset {0} as deserialization failed", assetId);
+ return null;
+ }
+ }
+
+ bool modified = false;
+ foreach (SceneObjectGroup sog in sceneObjects)
+ {
+ if (modifier(sog))
+ modified = true;
+ }
+
+ if (modified)
+ {
+ if (coa != null)
+ data = Utils.StringToBytes(CoalescedSceneObjectsSerializer.ToXml(coa));
+ else
+ data = Utils.StringToBytes(ToOriginalXmlFormat(sceneObjects[0]));
+ }
+
+ return data;
+ }
+
#region manual serialization
--
cgit v1.1