--- 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 transactions = new List(); + + 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()); }