mysimulation/server/FSO.Server.Debug/PacketView.cs
Tony Bark 22191ce648 Removed NioTSO client and server
- NioTSO client isn't needed because we're using RayLib
- Added FreeSO's API server to handle most backend operations
2024-05-01 02:55:43 -04:00

242 lines
7.3 KiB
C#
Executable file

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Be.Windows.Forms;
using Mina.Core.Buffer;
using System.IO;
using tso.debug.network;
using FSO.Server.Common;
using FSO.Server.Protocol.Voltron;
using FSO.Server.Debug.PacketAnalyzer;
using FSO.Server.Protocol.Aries;
using FSO.Server.Protocol.Voltron.Packets;
using FSO.Common.Serialization;
namespace FSO.Server.Debug
{
public partial class PacketView : UserControl
{
private RawPacketReference Packet;
private TabPage Tab;
private DynamicByteProvider BytesProvider;
private NetworkDebugger Inspector;
private object ParsedPacket;
private ISerializationContext Context;
public PacketView(RawPacketReference packet, TabPage tab, NetworkDebugger inspector, ISerializationContext context)
{
this.Tab = tab;
this.Packet = packet;
this.Inspector = inspector;
this.Context = context;
InitializeComponent();
BytesProvider = new DynamicByteProvider(packet.Packet.Data);
hex.ByteProvider = BytesProvider;
hex.StringViewVisible = true;
splitContainer1.Panel2Collapsed = true;
}
private void PacketView_Load(object sender, EventArgs e)
{
}
private void btnClose_Click(object sender, EventArgs e)
{
((TabControl)this.Tab.Parent).TabPages.Remove(Tab);
}
private void btnStash_Click(object sender, EventArgs e)
{
var toStash = new RawPacketReference
{
Packet = new Packet
{
Data = GetBytes(),
Direction = this.Packet.Packet.Direction,
Type = this.Packet.Packet.Type,
SubType = this.Packet.Packet.SubType
},
Sequence = this.Packet.Sequence
};
this.Inspector.Stash(toStash);
}
private void btnTools_Click(object sender, EventArgs e)
{
Analyze();
splitContainer1.Panel2Collapsed = !splitContainer1.Panel2Collapsed;
}
private void ParsePacket()
{
/** Can we parse it? **/
try
{
var packet = Packet.Packet;
if(packet.Type == PacketType.VOLTRON)
{
var voltronClazz = VoltronPackets.GetByPacketCode((ushort)packet.SubType);
if(voltronClazz != null)
{
IVoltronPacket parsed = (IVoltronPacket)Activator.CreateInstance(voltronClazz);
//TODO: VoltronContext
parsed.Deserialize(IoBuffer.Wrap(GetBytes()), Context);
this.ParsedPacket = parsed;
this.parsedInspetor.SelectedObject = ParsedPacket;
}
}else if(packet.Type == PacketType.ARIES)
{
var ariesClazz = AriesPackets.GetByPacketCode(packet.SubType);
if(ariesClazz != null)
{
IAriesPacket parsed = (IAriesPacket)Activator.CreateInstance(ariesClazz);
parsed.Deserialize(IoBuffer.Wrap(GetBytes()), Context);
this.ParsedPacket = parsed;
this.parsedInspetor.SelectedObject = ParsedPacket;
}
}
}
catch (Exception ex)
{
}
}
private void Analyze()
{
analyzeResults.Items.Clear();
var analyzers = new IPacketAnalyzer[]{
new PascalStringPacketAnalyzer(),
new ByteCountPacketAnalyzer(),
new ConstantsPacketAnalyzer(),
new VariableLengthStringAnalyzer(),
new ContentPacketAnalyzer()
};
var data = GetBytes();
foreach (var analyzer in analyzers)
{
var results = analyzer.Analyze(data);
if (results != null)
{
foreach (var result in results)
{
analyzeResults.Items.Add(result);
}
}
}
}
private List<ISocketSession> AllSessions = new List<ISocketSession>();
private void menuSend_DropDownOpening(object sender, EventArgs e)
{
/** Get the list of sessions **/
menuSend.DropDownItems.Clear();
AllSessions.Clear();
foreach (var session in Inspector.GetSessions())
{
var label = session.ToString();
var menuItem = new ToolStripMenuItem();
menuItem.Text = label;
menuItem.Click += new EventHandler(sendSession_Click);
menuSend.DropDownItems.Add(menuItem);
AllSessions.Add(session);
}
}
void sendSession_Click(object sender, EventArgs e)
{
var index = menuSend.DropDownItems.IndexOf((ToolStripItem)sender);
if (index != -1)
{
var session = AllSessions[index];
switch (Packet.Packet.Type)
{
case PacketType.VOLTRON:
var packet = new VariableVoltronPacket((ushort)Packet.Packet.SubType, GetBytes());
session.Write(packet);
break;
}
}
}
private byte[] GetBytes()
{
BytesProvider.ApplyChanges();
byte[] allBytes = new byte[BytesProvider.Bytes.Count];
for (int i = 0; i < allBytes.Length; i++)
{
allBytes[i] = BytesProvider.Bytes[i];
}
return allBytes;
}
private void analyzeResults_SelectedIndexChanged(object sender, EventArgs e)
{
if (analyzeResults.SelectedItem != null)
{
PacketAnalyzerResult item = (PacketAnalyzerResult)analyzeResults.SelectedItem;
hex.Select(item.Offset, item.Length);
}
}
private void btnParse_Click(object sender, EventArgs e)
{
ParsePacket();
}
private void btnImportBytes_Click(object sender, EventArgs e)
{
var result = importBrowser.ShowDialog(this);
if (result == DialogResult.OK)
{
var bytes = File.ReadAllBytes(importBrowser.FileName);
BytesProvider.InsertBytes(BytesProvider.Length, bytes);
}
}
private void btnExportByteArray_Click(object sender, EventArgs e)
{
var bytes = GetBytes();
var str = new StringBuilder();
str.Append("new byte[]{");
for (var i = 0; i < bytes.Length; i++)
{
if (i > 0)
{
str.Append(", ");
}
str.Append("0x" + (bytes[i].ToString("X2")));
}
str.Append("}");
Clipboard.SetText(str.ToString());
}
}
}