Seems there are multiple interpretations of the format of the content of the
<Media> element in OAR files. OpenSimulator (for reasons lost in the mist of time)
escapes the XML in the element and then reparses it was a separate XmlReader.
Other simulators fill the <Media> element with regular XML.
This patch parses the <Media> escaped XML content as it always has and, if
the parsing fails, falls back to trying to parse the pure XML.
The code used to call Serializer.ReadElementContentAsString() and then expected to
pass the XML to PrimitiveBaseShape.FromXml to parse. This would throw as
ReadElementContentAsString does not allow any children of the element.
Reading with Serializer.ReadInnerXml() was the fix.
This was only not a problem because most often shapes don't have media and
most simulators don't output anything if the media array is empty.
State being != 0.
Revert "Mantis #7932: Some objects were being serialized with PCode=9 and State != 0 (meaning attachments). That should never happen."
This reverts commit f19199cf4a.
If the XML was truncated for some reason then ExecuteReadProcessors() would get into an infinite loop, using high CPU. Now it detects EOF (and several other error cases) and aborts.
The rest of the changes just improve logging of XML in case of errors, so that we can see what the bad XML is.
(1) storing and getting assets over HG -- assuming the core HG asset service is being used (not the case with OSGrid!)
(2) importing assets via OAR and IAR
Instantiation of bad assets now should also work, instead of producing an exception, but the bad assets themselves aren't being fixed in the DB. That should be done with a cleaning tool -- see Perl script in Mantis #7657.
Virus!
This was previously effectively being done by XmlDocument in the multiple passes through the XML.
This change tells XmlReader to ignore whitespace. This also means changing arguments to use XmlReader instead of XmlTextReader (a descendent of XmlReader) directly.
XmlReader.Create() has been the recommend way to create XML readers since .NET 2.0 as per MS SDK and is the only way to specific ignore whitespace settings.
Reading large XML documents (e.g. complex attachments) is CPU expensive - this must be done as few times as possible (preferably just once).
Reading these documents into XmlDocument is also more resource intensive than using XmlTextReader, as per Microsoft's own publication "Improve .NET Application Performance and Scalability"
Optimization of other cases will follow if this change is successful.