/// <summary> /// Adds packet to list, scrolls down if scroll is true. /// </summary> /// <param name="palePacket"></param> /// <param name="scroll"></param> private void AddPacketToFormList(PalePacket palePacket, bool scroll) { var name = palePacket.OpName; if (name == "ZC_NORMAL") { var size = palePacket.Packet.GetShort(); var subOp = palePacket.Packet.GetInt(); name += "(0x" + subOp.ToString("X2") + ")"; palePacket.Packet.Rewind(); } var lvi = new ListViewItem((palePacket.Received ? "<" : ">") + palePacket.Op.ToString("X8")); lvi.UseItemStyleForSubItems = false; lvi.BackColor = palePacket.Received ? Color.FromArgb(0x0033bbff) : Color.FromArgb(0x00ff5522); lvi.ForeColor = Color.White; lvi.Tag = palePacket; lvi.SubItems.Add(name); lvi.SubItems.Add(palePacket.Time > DateTime.MinValue ? palePacket.Time.ToString("hh:mm:ss.fff") : ""); LstPackets.InvokeIfRequired((MethodInvoker) delegate { LstPackets.Items.Add(lvi); if (scroll) { LstPackets.Items[LstPackets.Items.Count - 1].EnsureVisible(); } }); }
/// <summary> /// Adds packet to list, scrolls down if scroll is true. /// </summary> /// <param name="palePacket"></param> /// <param name="scroll"></param> private void AddPacketToFormList(PalePacket palePacket, bool scroll) { var name = "?"; lock (opNames) { if (opNames.ContainsKey(palePacket.Op)) { name = opNames[palePacket.Op]; } } var lvi = new ListViewItem((palePacket.Received ? "<" : ">") + palePacket.Op.ToString("X8")); lvi.UseItemStyleForSubItems = false; lvi.BackColor = palePacket.Received ? Color.FromArgb(0x0033bbff) : Color.FromArgb(0x00ff5522); lvi.ForeColor = Color.White; lvi.Tag = palePacket; lvi.SubItems.Add(palePacket.Id.ToString("X16")); lvi.SubItems.Add(name); lvi.SubItems.Add(palePacket.Time > DateTime.MinValue ? palePacket.Time.ToString("hh:mm:ss.fff") : ""); LstPackets.InvokeIfRequired((MethodInvoker) delegate { LstPackets.Items.Add(lvi); if (scroll) { LstPackets.Items[LstPackets.Items.Count - 1].EnsureVisible(); } }); }
/// <summary> /// Loads log file and adds packets to list. /// </summary> /// <param name="path"></param> private void LoadFile(string path) { var newPackets = new List <PalePacket>(); using (var sr = new StreamReader(path)) { string line; while ((line = sr.ReadLine()) != null) { line = line.Trim(); var recv = false; if (string.IsNullOrWhiteSpace(line) || (!line.StartsWith("Send") && !(recv = line.StartsWith("Recv")))) { continue; } var spaceIdx = line.IndexOf(' '); var date = DateTime.MinValue; if (line[4] == '@') { date = DateTime.Parse(line.Substring(5, spaceIdx - 5)); } var packetStr = line.Substring(spaceIdx + 1, line.Length - spaceIdx - 1); var packetArr = HexTool.ToByteArray(packetStr); var packet = new Packet(packetArr, 0); var palePacket = new PalePacket(packet, date, recv); newPackets.Insert(0, palePacket); } } LstPackets.BeginUpdate(); foreach (var palePacket in newPackets) { AddPacketToFormList(palePacket, false); } LstPackets.EndUpdate(); UpdateCount(); foreach (var palePacket in newPackets) { if (palePacket.Received) { pluginManager.OnRecv(palePacket); } else { pluginManager.OnSend(palePacket); } } }
/// <summary> /// Clears packet list. /// </summary> private void ClearList() { LstPackets.BeginUpdate(); LstPackets.Items.Clear(); LstPackets.EndUpdate(); TxtPacket.Text = ""; UpdateCount(); }
/// <summary> /// Returns a thread-safe list of all current packets. /// </summary> /// <returns></returns> public IList <PalePacket> GetPacketList() { IList <PalePacket> result = null; LstPackets.InvokeIfRequired((MethodInvoker) delegate { result = LstPackets.Items.Cast <ListViewItem>().Select(a => (PalePacket)a.Tag).ToArray(); }); return(result); }
/// <summary> /// Removes packets at the given indexes from list. /// </summary> /// <param name="idxs"></param> private void RemoveFromList(IList <int> idxs) { LstPackets.BeginUpdate(); for (int i = idxs.Count - 1; i >= 0; --i) { LstPackets.Items.RemoveAt(idxs[i]); } LstPackets.EndUpdate(); UpdateCount(); }
/// <summary> /// Clears packet list. /// </summary> private void ClearList() { LstPackets.BeginUpdate(); LstPackets.Items.Clear(); LstPackets.EndUpdate(); TxtPacketInfo.Text = ""; HexBox.ByteProvider = null; pluginManager.OnClear(); UpdateCount(); }
/// <summary> /// Returns (first) currently selected packet or null. /// </summary> /// <returns></returns> public PalePacket GetSelectedPacket() { if (LstPackets.SelectedItems.Count == 0) { return(null); } if (!LstPackets.InvokeRequired) { return((PalePacket)LstPackets.SelectedItems[0].Tag); } PalePacket result = null; LstPackets.Invoke((MethodInvoker) delegate { result = (PalePacket)LstPackets.SelectedItems[0].Tag; }); return(result); }
/// <summary> /// Fired regularly while being connected, handles queued packets. /// </summary> /// <param name="state"></param> private void OnQueueTimer(object state, EventArgs args) { if (!WinApi.IsWindow(alissaHWnd)) { Disconnect(); } var count = packetQueue.Count; if (count == 0) { return; } queueTimer.Enabled = false; var newPackets = new List <PalePacket>(); for (int i = 0; i < count; ++i) { PalePacket palePacket; lock (packetQueue) palePacket = packetQueue.Dequeue(); if (palePacket == null) { continue; } newPackets.Add(palePacket); } LstPackets.InvokeIfRequired((MethodInvoker) delegate { LstPackets.BeginUpdate(); foreach (var palePacket in newPackets) { lock (recvFilter) if (Settings.Default.FilterRecvEnabled && recvFilter.Contains(palePacket.Op)) { continue; } lock (sendFilter) if (Settings.Default.FilterSendEnabled && sendFilter.Contains(palePacket.Op)) { continue; } AddPacketToFormList(palePacket, true); if (palePacket.Received) { pluginManager.OnRecv(palePacket); } else { pluginManager.OnSend(palePacket); } } LstPackets.EndUpdate(); }); UpdateCount(); queueTimer.Enabled = true; }
/// <summary> /// Loads log file and adds packets to list. /// </summary> /// <param name="path"></param> private void LoadFile(string path) { var newPackets = new List <PalePacket>(); using (var sr = new StreamReader(path)) { string line; for (int ln = 1; (line = sr.ReadLine()) != null; ++ln) { try { line = line.Trim(); var recv = false; if (string.IsNullOrWhiteSpace(line) || (!line.StartsWith("Send ") && !(recv = line.StartsWith("Recv ")))) { continue; } var tabIndex = line.IndexOf('\t'); var split = line.Substring(0, tabIndex).Split(' '); PacketType type; DateTime date; string name; int length = -1; if (split.Length == 3) { type = (split[0] == "Send" ? PacketType.ClientServer : PacketType.ServerClient); date = DateTime.Parse(split[1]); name = split[2]; } else if (split.Length == 4) { type = (split[0] == "Send" ? PacketType.ClientServer : PacketType.ServerClient); date = DateTime.Parse(split[1]); name = split[2]; length = Convert.ToInt32(split[3]); } else { continue; } var packetStr = line.Substring(tabIndex + 1, line.Length - tabIndex - 1); var packetArr = HexTool.ToByteArray(packetStr); var packet = new Packet(packetArr, type); var palePacket = new PalePacket(name, length, packet, date, recv); newPackets.Insert(0, palePacket); } catch (Exception ex) { MessageBox.Show("Error on line " + ln + ": " + ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } } LstPackets.BeginUpdate(); foreach (var palePacket in newPackets) { AddPacketToFormList(palePacket, false); } LstPackets.EndUpdate(); UpdateCount(); foreach (var palePacket in newPackets) { if (palePacket.Received) { pluginManager.OnRecv(palePacket); } else { pluginManager.OnSend(palePacket); } } }