/// <summary>
/// Decode an AMF packet into an AMFX format.
/// </summary>
/// <exception cref="FormatException">Error during decoding.</exception>
public void Decode(Stream stream, XmlWriter output)
{
if (stream == null) throw new ArgumentNullException("stream");
if (!stream.CanRead) throw new ArgumentException(Errors.AmfPacketReader_Read_StreamClosed, "stream");
if (output == null) throw new ArgumentNullException("output");
try
{
var amfStreamReader = new AmfStreamReader(stream);
var version = ReadPacketVersion(amfStreamReader);
var decoder = CreateDecoder(version, _options);
output.WriteStartDocument();
output.WriteStartElement(AmfxContent.AmfxDocument, AmfxContent.Namespace);
output.WriteAttributeString(AmfxContent.VersionAttribute, version.ToAmfxName());
output.Flush();
//Read headers
var headerCount = ReadDataCount(amfStreamReader);
for (var i = 0; i < headerCount; i++)
{
var header = decoder.ReadPacketHeader(stream);
output.WriteStartElement(AmfxContent.PacketHeader);
output.WriteAttributeString(AmfxContent.PacketHeaderName, header.Name);
output.WriteAttributeString(AmfxContent.PacketHeaderMustUnderstand, header.MustUnderstand.ToString());
decoder.Decode(stream, output);
output.WriteEndElement();
output.Flush();
}
//Read messages
var messageCount = ReadDataCount(amfStreamReader);
for (var i = 0; i < messageCount; i++)
{
var body = decoder.ReadPacketBody(stream);
output.WriteStartElement(AmfxContent.PacketBody);
output.WriteAttributeString(AmfxContent.PacketBodyTarget, body.Target);
output.WriteAttributeString(AmfxContent.PacketBodyResponse, body.Response);
decoder.Decode(stream, output);
output.WriteEndElement();
output.Flush();
}
output.WriteEndElement();
output.WriteEndDocument();
output.Flush();
}
catch (Exception e)
{
output.Flush();
throw new FormatException(Errors.AmfPacketReader_DecodingError, e);
}
}