diff options
author | Oren Hurvitz | 2013-11-18 13:14:49 +0200 |
---|---|---|
committer | Oren Hurvitz | 2014-03-24 18:18:29 +0100 |
commit | 1769e93c42384125eb75fcc21dee43bb52a6090a (patch) | |
tree | eb5fdac14d75e60373b25866398133fc12375eeb /OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs | |
parent | In Load OAR, correctly restore group-owned objects (diff) | |
download | opensim-SC-1769e93c42384125eb75fcc21dee43bb52a6090a.zip opensim-SC-1769e93c42384125eb75fcc21dee43bb52a6090a.tar.gz opensim-SC-1769e93c42384125eb75fcc21dee43bb52a6090a.tar.bz2 opensim-SC-1769e93c42384125eb75fcc21dee43bb52a6090a.tar.xz |
Fixed parsing of coalesced objects if the XML starts with an XML Declaration ("<xml ...>")
Resolves http://opensimulator.org/mantis/view.php?id=6944
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs | 89 |
1 files changed, 45 insertions, 44 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs index 5cb271d..a556f9d 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs | |||
@@ -119,21 +119,22 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
119 | return output; | 119 | return output; |
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | public static bool TryFromXml(string xml, out CoalescedSceneObjects coa) | 123 | public static bool TryFromXml(string xml, out CoalescedSceneObjects coa) |
124 | { | 124 | { |
125 | // m_log.DebugFormat("[COALESCED SCENE OBJECTS SERIALIZER]: TryFromXml() deserializing {0}", xml); | 125 | // m_log.DebugFormat("[COALESCED SCENE OBJECTS SERIALIZER]: TryFromXml() deserializing {0}", xml); |
126 | 126 | ||
127 | coa = null; | 127 | coa = null; |
128 | int i = 0; | ||
129 | 128 | ||
130 | using (StringReader sr = new StringReader(xml)) | 129 | try |
131 | { | 130 | { |
132 | using (XmlTextReader reader = new XmlTextReader(sr)) | 131 | // Quickly check if this is a coalesced object, without fully parsing the XML |
133 | { | 132 | using (StringReader sr = new StringReader(xml)) |
134 | try | 133 | { |
134 | using (XmlTextReader reader = new XmlTextReader(sr)) | ||
135 | { | 135 | { |
136 | reader.Read(); | 136 | reader.MoveToContent(); // skip possible xml declaration |
137 | |||
137 | if (reader.Name != "CoalescedObject") | 138 | if (reader.Name != "CoalescedObject") |
138 | { | 139 | { |
139 | // m_log.DebugFormat( | 140 | // m_log.DebugFormat( |
@@ -142,49 +143,49 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
142 | 143 | ||
143 | return false; | 144 | return false; |
144 | } | 145 | } |
145 | 146 | } | |
146 | coa = new CoalescedSceneObjects(UUID.Zero); | 147 | } |
147 | reader.Read(); | ||
148 | |||
149 | while (reader.NodeType != XmlNodeType.EndElement && reader.Name != "CoalescedObject") | ||
150 | { | ||
151 | if (reader.Name == "SceneObjectGroup") | ||
152 | { | ||
153 | string soXml = reader.ReadOuterXml(); | ||
154 | |||
155 | SceneObjectGroup so = SceneObjectSerializer.FromOriginalXmlFormat(soXml); | ||
156 | |||
157 | if (so != null) | ||
158 | { | ||
159 | coa.Add(so); | ||
160 | } | ||
161 | else | ||
162 | { | ||
163 | // XXX: Possibly we should fail outright here rather than continuing if a particular component of the | ||
164 | // coalesced object fails to load. | ||
165 | m_log.WarnFormat( | ||
166 | "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml for component {0} failed. Continuing.", | ||
167 | i); | ||
168 | } | ||
169 | 148 | ||
170 | i++; | 149 | XmlDocument doc = new XmlDocument(); |
171 | } | 150 | doc.LoadXml(xml); |
172 | } | 151 | XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); |
152 | if (e == null) | ||
153 | return false; | ||
173 | 154 | ||
174 | reader.ReadEndElement(); // CoalescedObject | 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); | ||
175 | } | 166 | } |
176 | catch (Exception e) | 167 | else |
177 | { | 168 | { |
178 | m_log.ErrorFormat( | 169 | // XXX: Possibly we should fail outright here rather than continuing if a particular component of the |
179 | "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml failed with {0} {1}", | 170 | // coalesced object fails to load. |
180 | e.Message, e.StackTrace); | 171 | m_log.WarnFormat( |
181 | 172 | "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml for component {0} failed. Continuing.", | |
182 | return false; | 173 | i); |
183 | } | 174 | } |
175 | |||
176 | i++; | ||
184 | } | 177 | } |
185 | } | 178 | } |
179 | catch (Exception e) | ||
180 | { | ||
181 | m_log.Error(string.Format( | ||
182 | "[COALESCED SCENE OBJECTS SERIALIZER]: Deserialization of xml failed with {0} ", | ||
183 | e.Message), e); | ||
184 | |||
185 | return false; | ||
186 | } | ||
186 | 187 | ||
187 | return true; | 188 | return true; |
188 | } | 189 | } |
189 | } | 190 | } |
190 | } \ No newline at end of file | 191 | } |