OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
CoalescedSceneObjectsSerializer.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.Collections.Generic;
30 using System.Drawing;
31 using System.IO;
32 using System.Reflection;
33 using System.Xml;
34 using log4net;
35 using OpenMetaverse;
36 using OpenSim.Framework;
37 using OpenSim.Region.Framework.Interfaces;
38 using OpenSim.Region.Framework.Scenes;
39 
40 namespace OpenSim.Region.Framework.Scenes.Serialization
41 {
46  {
47  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 
57  public static string ToXml(CoalescedSceneObjects coa)
58  {
59  return ToXml(coa, true);
60  }
61 
70  public static string ToXml(CoalescedSceneObjects coa, bool doScriptStates)
71  {
72  using (StringWriter sw = new StringWriter())
73  {
74  using (XmlTextWriter writer = new XmlTextWriter(sw))
75  {
76  Vector3 size;
77 
78  List<SceneObjectGroup> coaObjects = coa.Objects;
79 
80 // m_log.DebugFormat(
81 // "[COALESCED SCENE OBJECTS SERIALIZER]: Writing {0} objects for coalesced object",
82 // coaObjects.Count);
83 
84  // This is weak - we're relying on the set of coalesced objects still being identical
85  Vector3[] offsets = coa.GetSizeAndOffsets(out size);
86 
87  writer.WriteStartElement("CoalescedObject");
88 
89  writer.WriteAttributeString("x", size.X.ToString());
90  writer.WriteAttributeString("y", size.Y.ToString());
91  writer.WriteAttributeString("z", size.Z.ToString());
92 
93  // Embed the offsets into the group XML
94  for (int i = 0; i < coaObjects.Count; i++)
95  {
96  SceneObjectGroup obj = coaObjects[i];
97 
98 // m_log.DebugFormat(
99 // "[COALESCED SCENE OBJECTS SERIALIZER]: Writing offset for object {0}, {1}",
100 // i, obj.Name);
101 
102  writer.WriteStartElement("SceneObjectGroup");
103  writer.WriteAttributeString("offsetx", offsets[i].X.ToString());
104  writer.WriteAttributeString("offsety", offsets[i].Y.ToString());
105  writer.WriteAttributeString("offsetz", offsets[i].Z.ToString());
106 
107  SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, doScriptStates);
108 
109  writer.WriteEndElement(); // SceneObjectGroup
110  }
111 
112  writer.WriteEndElement(); // CoalescedObject
113  }
114 
115  string output = sw.ToString();
116 
117 // Console.WriteLine(output);
118 
119  return output;
120  }
121  }
122 
123  public static bool TryFromXml(string xml, out CoalescedSceneObjects coa)
124  {
125 // m_log.DebugFormat("[COALESCED SCENE OBJECTS SERIALIZER]: TryFromXml() deserializing {0}", xml);
126 
127  coa = null;
128 
129  try
130  {
131  // Quickly check if this is a coalesced object, without fully parsing the XML
132  using (StringReader sr = new StringReader(xml))
133  {
134  using (XmlTextReader reader = new XmlTextReader(sr))
135  {
136  reader.MoveToContent(); // skip possible xml declaration
137 
138  if (reader.Name != "CoalescedObject")
139  {
140  // m_log.DebugFormat(
141  // "[COALESCED SCENE OBJECTS SERIALIZER]: TryFromXml() root element was {0} so returning false",
142  // reader.Name);
143 
144  return false;
145  }
146  }
147  }
148 
149  XmlDocument doc = new XmlDocument();
150  doc.LoadXml(xml);
151  XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
152  if (e == null)
153  return false;
154 
155  coa = new CoalescedSceneObjects(UUID.Zero);
156 
157  XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
158  int i = 0;
159 
160  foreach (XmlNode n in groups)
161  {
162  SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
163  if (so != null)
164  {
165  coa.Add(so);
166  }
167  else
168  {
169  // XXX: Possibly we should fail outright here rather than continuing if a particular component of the
170  // coalesced object fails to load.
171  m_log.WarnFormat(
172  "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml for component {0} failed. Continuing.",
173  i);
174  }
175 
176  i++;
177  }
178  }
179  catch (Exception e)
180  {
181  m_log.Error("[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml failed ", e);
182  Util.LogFailedXML("[COALESCED SCENE OBJECTS SERIALIZER]:", xml);
183  return false;
184  }
185 
186  return true;
187  }
188  }
189 }
A scene object group is conceptually an object in the scene. The object is constituted of SceneObject...
Interactive OpenSim region server
Definition: OpenSim.cs:55
static string ToXml(CoalescedSceneObjects coa, bool doScriptStates)
Serialize coalesced objects to Xml
static string ToXml(CoalescedSceneObjects coa)
Serialize coalesced objects to Xml
Represents a coalescene of scene objects. A coalescence occurs when objects that are not in the same ...