diff --git a/Sniffer/Models/ScrollingListView.cs b/Sniffer/Models/ScrollingListView.cs new file mode 100644 index 0000000..99ccbdb --- /dev/null +++ b/Sniffer/Models/ScrollingListView.cs @@ -0,0 +1,28 @@ +using System.Collections.Specialized; +using System.Windows; +using System.Windows.Controls; + +namespace Sniffer.Models +{ + public class ScrollingListView : ListView + { + public static readonly DependencyProperty FilterPredicateProperty = DependencyProperty.Register("AutoScroll", + typeof(bool), typeof(ListView), new PropertyMetadata(null)); + public bool AutoScroll + { + get { return (bool)GetValue(FilterPredicateProperty); } + set { SetValue(FilterPredicateProperty, value); } + } + + protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) + { + if (!AutoScroll || e.NewItems == null) return; + var newItemCount = e.NewItems.Count; + + if (newItemCount > 0) + ScrollIntoView(e.NewItems[newItemCount - 1]); + + base.OnItemsChanged(e); + } + } +} diff --git a/Sniffer/ViewModels/MainViewModel.cs b/Sniffer/ViewModels/MainViewModel.cs index e832c75..78be4bf 100644 --- a/Sniffer/ViewModels/MainViewModel.cs +++ b/Sniffer/ViewModels/MainViewModel.cs @@ -2,12 +2,12 @@ using OXGaming.TibiaAPI.Constants; using OXGaming.TibiaAPI.Utilities; using Sniffer.Models; +using Sniffer.Views; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; -using System.Runtime.InteropServices; using System.Windows; using System.Windows.Input; @@ -15,16 +15,11 @@ namespace Sniffer.ViewModels { public class MainViewModel : PropertyChangedBase { - [DllImport("Kernel32")] - public static extern void AllocConsole(); - - [DllImport("Kernel32")] - public static extern void FreeConsole(); - + private MainWindow _window; #region TibiaApi private Client _client; - #endregion + private ObservableCollection _packets; public ObservableCollection Packets { @@ -75,42 +70,54 @@ public string FilterOpCode get { return _filterOpCode.ToString(); } set { - int opCode; - if(int.TryParse(value, out opCode)) + if (int.TryParse(value, out int opCode)) { _filterOpCode = opCode; + OnPropertyChanged(); } } } - public MainViewModel() + private bool _autoScroll; + public bool AutoScroll { - if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) + get { return _autoScroll; } + set { - try - { - - AllocConsole(); - - using (_client = new Client(string.Empty)) - { - _client.Logger.Level = Logger.LogLevel.Error; - _client.Logger.Output = Logger.LogOutput.Console; - - _client.Connection.OnReceivedClientMessage += Proxy_OnReceivedClientMessage; - _client.Connection.OnReceivedServerMessage += Proxy_OnReceivedServerMessage; + _autoScroll = value; + OnPropertyChanged(); + } + } - _client.Connection.IsClientPacketParsingEnabled = false; - _client.Connection.IsServerPacketParsingEnabled = false; - _client.StartConnection(httpPort: 7171, loginWebService: string.Empty); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } + public MainViewModel() + { + Packets = new ObservableCollection(); + FilteredPackets = new ObservableCollection(); + + AddToPackets(PacketType.Client, new byte[] { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Client, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Client, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Server, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Client, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Server, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Client, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + AddToPackets(PacketType.Server, new byte[] { 0x01, 0x02, 0x03, 0x04 }); + + //if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) + //{ + // _client = new Client(string.Empty); + + // _client.Logger.Level = Logger.LogLevel.Error; + // _client.Logger.Output = Logger.LogOutput.Console; + + // _client.Connection.OnReceivedClientMessage += Proxy_OnReceivedClientMessage; + // _client.Connection.OnReceivedServerMessage += Proxy_OnReceivedServerMessage; + + // _client.Connection.IsClientPacketParsingEnabled = false; + // _client.Connection.IsServerPacketParsingEnabled = false; + // _client.StartConnection(httpPort: 7171, loginWebService: string.Empty); + //} } private void Proxy_OnReceivedClientMessage(byte[] data) @@ -126,18 +133,27 @@ private void Proxy_OnReceivedServerMessage(byte[] data) public void AddToPackets(PacketType type, byte[] data) { var packet = new Packet(type, data); - Packets.Add(packet); + Application.Current.Dispatcher.Invoke(delegate + { + Packets.Add(packet); + }); var filterType = (PacketType)(SelectedPacketTypeIndex - 1); - if (filterType == type) + if (filterType == type || SelectedPacketTypeIndex == 0) if (_filterOpCode > 0) { if (_filterOpCode == packet.OpCode) - FilteredPackets.Add(packet); + Application.Current.Dispatcher.Invoke(delegate + { + FilteredPackets.Add(packet); + }); } else { - FilteredPackets.Add(packet); + Application.Current.Dispatcher.Invoke(delegate + { + FilteredPackets.Add(packet); + }); } } @@ -149,8 +165,6 @@ private void Filter() //Filter Type IEnumerable filteredList = null; - if (FilteredPackets == null) - FilteredPackets = new ObservableCollection(); FilteredPackets.Clear(); if (SelectedPacketTypeIndex == 1) { @@ -173,5 +187,20 @@ private void Filter() FilteredPackets = new ObservableCollection(filteredList); } + + public ICommand ClearCommand => new Command(_ => Clear()); + private void Clear() + { + Packets.Clear(); + FilteredPackets.Clear(); + } + public ICommand RemoveCommand => new Command(_ => Remove()); + private void Remove() + { + if(Packets.Contains(SelectedPacket)) + Packets.Remove(SelectedPacket); + if (FilteredPackets.Contains(SelectedPacket)) + FilteredPackets.Remove(SelectedPacket); + } } } diff --git a/Sniffer/Views/MainWindow.xaml b/Sniffer/Views/MainWindow.xaml index 42a5a33..2c14fb7 100644 --- a/Sniffer/Views/MainWindow.xaml +++ b/Sniffer/Views/MainWindow.xaml @@ -6,9 +6,10 @@ xmlns:local="clr-namespace:Sniffer" xmlns:ViewModels="clr-namespace:Sniffer.ViewModels" xmlns:hv="clr-namespace:HexView.Wpf;assembly=HexView.Wpf" + xmlns:models="clr-namespace:Sniffer.Models" x:Class="Sniffer.Views.MainWindow" mc:Ignorable="d" - Title="MainWindow" Height="700" Width="600"> + Title="Sniffer" Height="700" Width="600"> @@ -17,19 +18,26 @@ - + - +