rendered paste body--- oSpy/Parser/MSN.cs
+++ oSpy/Parser/MSN.cs
@@ -285,6 +285,68 @@
}
}
+ public class MSNSBVisualizer : SessionVisualizer
+ {
+ public override string Name
+ {
+ get { return "MSNSwitchboard"; }
+ }
+
+ public override VisualTransaction[] GetTransactions(IPSession session)
+ {
+ List<VisualTransaction> transactions = new List<VisualTransaction>();
+
+ foreach (TransactionNode node in session.Nodes)
+ {
+ if (node.Name == "MSNSBCommand")
+ {
+ IPPacket pkt = node.Slices[0].Packet;
+
+ VisualTransaction vt = new VisualTransaction(node.Index, pkt.Direction, pkt.Timestamp);
+
+ string headline = (string) node["Command"];
+
+ if (node.Fields.ContainsKey("Arguments"))
+ headline += " " + (string) node["Arguments"];
+
+ vt.HeadlineText = headline;
+
+ TransactionNode payloadNode = node.FindChild("Payload", false);
+ if (payloadNode != null)
+ {
+ string body = "";
+
+ if (payloadNode.Fields.ContainsKey("XML"))
+ {
+ XMLHighlighter highlighter;
+
+ XML.PrettyPrint((string)payloadNode["XML"], out body, out highlighter);
+ }
+ else if (payloadNode.Fields.ContainsKey("Text"))
+ {
+ body = (string)payloadNode["Text"];
+ }
+ else if (payloadNode.Fields.ContainsKey("MSNSLP"))
+ {
+ body = (string)payloadNode["MSNSLP"];
+ }
+ else
+ {
+ body = String.Format("Unhandled payload format: {0}",
+ (payloadNode.FieldNames.Count > 0) ? payloadNode.FieldNames[0] : payloadNode.Children[0].Name);
+ }
+
+ vt.BodyText = body;
+ }
+
+ transactions.Add(vt);
+ }
+ }
+
+ return transactions.ToArray();
+ }
+ }
+
[Serializable()]
public class MSNSLPCall
{
--- oSpy/VisualSession.cs
+++ oSpy/VisualSession.cs
@@ -229,6 +229,7 @@
Register(new TCPVisualizer());
Register(new HTTPVisualizer());
+ Register(new MSNSBVisualizer());
Register(new MSNP2PVisualizer());
}