Ejemplo n.º 1
0
        public static DsoChatPacket Parse(string rawXmlData, byte[] rawData)
        {
            PacketLogger.LogPacket(rawXmlData);

            string xmlBody = SkipHeader(rawXmlData);

            if (string.IsNullOrEmpty(xmlBody))
            {
                // Failed to match against XML
                // Try AMF
                DsoChatPacket amfPacket;
                if ((amfPacket = TryParseAmf(rawXmlData, rawData)) == null)
                {
                    return(null);
                }

                return(amfPacket);
            }
            if (BodyDetection.IsMatch(xmlBody) == false)
            {
                return(null);
            }

            PacketLogger.LogChatPacket(xmlBody);

            // Remove namespaces..
            xmlBody = Regex.Replace(xmlBody, " xmlns=(\"|')[^\"']*(\"|')", "");

            // Get all messages
            MatchCollection matches = RegexMessages.Matches(xmlBody);

            if (matches == null || matches.Count == 0)
            {
                return(null);
            }

            // Build our xml struct
            // <body><messages>...</messages></body>
            string validXml = "<body><messages>";

            foreach (Match match in matches)
            {
                validXml += match.Value;
            }
            validXml += "</messages></body>";

            // Deserialize
            try {
                XmlSerializer serializer = new XmlSerializer(typeof(DsoChatPacket));
                using (StringReader stringStream = new StringReader(validXml)) {
                    DsoChatPacket doc = (DsoChatPacket)serializer.Deserialize(stringStream);
                    return(doc);
                }
            } catch {
                // Incomplete packet maybe..

                return(null);
            }
        }