/// <summary> /// Prepares the script instance for save. /// </summary> /// <remarks> /// This involves triggering the detach event and getting the script state (which also stops the script) /// This MUST be done outside sp.AttachmentsSyncLock, since otherwise there is a chance of deadlock if a /// running script is performing attachment operations. /// </remarks> /// <returns> /// The script state ready for persistence. /// </returns> /// <param name='grp'> /// </param> /// <param name='fireDetachEvent'> /// If true, then fire the script event before we save its state. /// </param> private string PrepareScriptInstanceForSave(SceneObjectGroup grp, bool fireDetachEvent) { if (fireDetachEvent) m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero); using (StringWriter sw = new StringWriter()) { using (XmlTextWriter writer = new XmlTextWriter(sw)) { grp.SaveScriptedState(writer); } return sw.ToString(); } }
/// <summary> /// Serialize a scene object to the original xml format /// </summary> /// <param name="sceneObject"></param> /// <param name="writer"></param> /// <param name="noRootElement">If false, don't write the enclosing SceneObjectGroup element</param> /// <returns></returns> public static void ToOriginalXmlFormat( SceneObjectGroup sceneObject, XmlTextWriter writer, bool doScriptStates, bool noRootElement) { // m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", sceneObject.Name); // int time = System.Environment.TickCount; if (!noRootElement) writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty); writer.WriteStartElement(String.Empty, "RootPart", String.Empty); ToXmlFormat(sceneObject.RootPart, writer); writer.WriteEndElement(); writer.WriteStartElement(String.Empty, "OtherParts", String.Empty); SceneObjectPart[] parts = sceneObject.Parts; for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; if (part.UUID != sceneObject.RootPart.UUID) { writer.WriteStartElement(String.Empty, "Part", String.Empty); ToXmlFormat(part, writer); writer.WriteEndElement(); } } writer.WriteEndElement(); // OtherParts if (doScriptStates) sceneObject.SaveScriptedState(writer); if (!noRootElement) writer.WriteEndElement(); // SceneObjectGroup // m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", sceneObject.Name, System.Environment.TickCount - time); }
private string GetObjectScriptStates(SceneObjectGroup grp) { using (StringWriter sw = new StringWriter()) { using (XmlTextWriter writer = new XmlTextWriter(sw)) { grp.SaveScriptedState(writer); } return sw.ToString(); } }
/// <summary> /// Prepares the script instance for save. /// </summary> /// <remarks> /// This involves triggering the detach event and getting the script state (which also stops the script) /// This MUST be done outside sp.AttachmentsSyncLock, since otherwise there is a chance of deadlock if a /// running script is performing attachment operations. /// </remarks> /// <returns> /// The script state ready for persistence. /// </returns> /// <param name='grp'> /// </param> /// <param name='fireDetachEvent'> /// If true, then fire the script event before we save its state. /// </param> private string PrepareScriptInstanceForSave(SceneObjectGroup grp, bool fireDetachEvent) { if (fireDetachEvent) { m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero); // Allow detach event time to do some work before stopping the script Thread.Sleep(2); } using (StringWriter sw = new StringWriter()) { using (XmlTextWriter writer = new XmlTextWriter(sw)) { grp.SaveScriptedState(writer); } return sw.ToString(); } }
/// <summary> /// Serialize a scene object to the 'xml2' format. /// </summary> /// <param name="sceneObject"></param> /// <returns></returns> public static void ToXml2Format(SceneObjectGroup sceneObject, XmlTextWriter writer) { //m_log.DebugFormat("[SERIALIZER]: Starting serialization of SOG {0} to XML2", Name); //int time = System.Environment.TickCount; writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty); sceneObject.RootPart.ToXml(writer); writer.WriteStartElement(String.Empty, "OtherParts", String.Empty); lock (sceneObject.Children) { foreach (SceneObjectPart part in sceneObject.Children.Values) { if (part.UUID != sceneObject.RootPart.UUID) { part.ToXml(writer); } } } writer.WriteEndElement(); // End of OtherParts sceneObject.SaveScriptedState(writer); writer.WriteEndElement(); // End of SceneObjectGroup //m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0} to XML2, {1}ms", Name, System.Environment.TickCount - time); }
/// <summary> /// Serialize a scene object to the original xml format /// </summary> /// <param name="sceneObject"></param> /// <returns></returns> public static void ToOriginalXmlFormat(SceneObjectGroup sceneObject, XmlTextWriter writer, StopScriptReason stopScriptReason) { //m_log.DebugFormat("[SERIALIZER]: Starting serialization of {0}", Name); //int time = System.Environment.TickCount; writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty); writer.WriteStartElement(String.Empty, "RootPart", String.Empty); sceneObject.RootPart.ToXml(writer); writer.WriteEndElement(); writer.WriteStartElement(String.Empty, "OtherParts", String.Empty); foreach (SceneObjectPart part in sceneObject.GetParts()) { if (part.UUID != sceneObject.RootPart.UUID) { writer.WriteStartElement(String.Empty, "Part", String.Empty); part.ToXml(writer); writer.WriteEndElement(); } } writer.WriteEndElement(); // OtherParts sceneObject.SaveScriptedState(writer, stopScriptReason); writer.WriteEndElement(); // SceneObjectGroup //m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); }