public ICollection <Packet> ReadLog(Stream stream, ProgressCallback callback) { int counter = 0; string line = null; Packet pak = null; PacketLog log = new PacketLog(); int dataBytesCount = -1; ArrayList ignoredPacketHeaders = new ArrayList(); string header = ""; using (StreamReader s = new StreamReader(stream, Encoding.ASCII)) { try { while ((line = s.ReadLine()) != null) { if (callback != null && (counter++ & 0x1FFF) == 0) // update progress every 8k lines { callback((int)(stream.Position >> 10), (int)(stream.Length >> 10)); } if (line.Length < 1) { continue; } if (line[0] == '<') { if (pak != null) { if (pak.Length == dataBytesCount) { /// Completed packet! try { pak.InitLog(log); } catch {} } else { ignoredPacketHeaders.Add(header); } } header = line; try { int code; ePacketDirection dir; ePacketProtocol prot; TimeSpan time; dataBytesCount = DaocLoggerV3TextLogReader.ParseHeader(line, out code, out dir, out prot, out time); if (dataBytesCount < 0) { pak = null; ignoredPacketHeaders.Add(header); } else { // header parsed successfully! if (code == 0xa9) { packetsCount++; // get statistics pak = null; // ignore the data } continue; /* pak = PacketManager.CreatePacket(log.Version, code, dir, dataBytesCount); * pak.Code = code; * pak.Direction = dir; * pak.Protocol = prot; * pak.Time = time;*/ } } catch { pak = null; ignoredPacketHeaders.Add(header); } continue; } if (pak == null) { continue; } DaocLoggerV3TextLogReader.ParseDataLine(line, pak); } } catch (Exception e) { Log.Error("reading file", e); } if (pak != null) { if (pak.Length == dataBytesCount) { // last completed packet! } else { ignoredPacketHeaders.Add(header); } } } if (ignoredPacketHeaders.Count > 0) { StringBuilder ignored = new StringBuilder("Ignored packets: " + ignoredPacketHeaders.Count + "\n\n"); for (int i = 0; i < ignoredPacketHeaders.Count; i++) { string s = (string)ignoredPacketHeaders[i]; ignored.Append('\n').Append(s); if (i > 15) { ignored.Append("\n..."); break; } } Log.Info(ignored.ToString()); } return(new List <Packet>(0)); }
public ICollection <Packet> ReadLog(Stream stream, ProgressCallback callback) { List <Packet> packets = new List <Packet>((int)(stream.Length / 128)); int counter = 0; Packet pak = null; PacketLog log = new PacketLog(); int dataBytesCount = -1; int ignoredCount = 0; StringBuilder header = new StringBuilder('<', 64); using (BinaryReader s = new BinaryReader(stream, Encoding.ASCII)) { try { while (s.BaseStream.Position < s.BaseStream.Length) { if (callback != null && (counter++ & 0xFFF) == 0) // update progress every 4096th packet { callback((int)(s.BaseStream.Position >> 10), (int)(s.BaseStream.Length >> 10)); } if (s.ReadChar() != '<') { continue; } if (pak != null) { if (pak.Length == dataBytesCount) { packets.Add(pak); try { pak.InitLog(log); } catch {} } else { ignoredCount++; } } // get the header string header.Length = 1; header.Append(s.ReadChars(48)); for (;;) { char curChar = s.ReadChar(); if (curChar == '<') { s.BaseStream.Seek(-1, SeekOrigin.Current); break; } header.Append(curChar); if (curChar == '>') { s.BaseStream.Seek(2, SeekOrigin.Current); break; } if (header.Length > 128) { break; } } try { int code; ePacketDirection dir; ePacketProtocol prot; TimeSpan time; dataBytesCount = DaocLoggerV3TextLogReader.ParseHeader(header.ToString(), out code, out dir, out prot, out time); pak = PacketManager.CreatePacket(log.Version, (byte)code, dir, dataBytesCount); pak.Code = (byte)code; pak.Direction = dir; pak.Protocol = prot; pak.Time = time; } catch { pak = null; ignoredCount++; // MessageBox.Show("parse header failed:\nposition="+s.BaseStream.Position+"\n'"+header.ToString()+"'\n"); } if (pak == null) { continue; } byte[] pakData = s.ReadBytes(dataBytesCount); pak.Write(pakData, 0, pakData.Length); } } catch (Exception e) { Log.Error("reading file", e); } if (pak != null) { if (pak.Length == dataBytesCount) { packets.Add(pak); } else { ignoredCount++; } } } if (ignoredCount > 0) { Log.Info("ignored packets: " + ignoredCount); } return(packets); }