2010-03-01 16:47:58 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using Specialized = System.Collections.Specialized;
|
|
|
|
|
using Reflection = System.Reflection;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Diagnostics;
|
2010-03-04 14:54:20 +00:00
|
|
|
|
using GSDumpGUI.Properties;
|
2010-12-19 10:48:09 +00:00
|
|
|
|
using System.IO;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
using TCPLibrary.MessageBased.Core;
|
2010-03-01 16:47:58 +00:00
|
|
|
|
|
|
|
|
|
namespace GSDumpGUI
|
|
|
|
|
{
|
|
|
|
|
static class Program
|
|
|
|
|
{
|
|
|
|
|
static public GSDumpGUI frmMain;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
static public TCPLibrary.MessageBased.Core.BaseMessageServer Server;
|
|
|
|
|
static public List<TCPLibrary.MessageBased.Core.BaseMessageClientS> Clients;
|
2010-03-01 16:47:58 +00:00
|
|
|
|
|
2010-12-19 15:55:52 +00:00
|
|
|
|
static public TCPLibrary.MessageBased.Core.BaseMessageClient Client;
|
2010-03-04 14:54:20 +00:00
|
|
|
|
static private Boolean ChangeIcon;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
static private GSDump dump;
|
2010-03-04 14:54:20 +00:00
|
|
|
|
|
2010-03-01 16:47:58 +00:00
|
|
|
|
[STAThread]
|
|
|
|
|
static void Main(String[] args)
|
|
|
|
|
{
|
2010-03-04 13:47:36 +00:00
|
|
|
|
if (args.Length == 4)
|
2010-03-01 16:47:58 +00:00
|
|
|
|
{
|
2010-12-19 15:55:52 +00:00
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Client = new TCPLibrary.MessageBased.Core.BaseMessageClient();
|
|
|
|
|
Client.OnMessageReceived += new TCPLibrary.MessageBased.Core.BaseMessageClient.MessageReceivedHandler(Client_OnMessageReceived);
|
|
|
|
|
Client.Connect("localhost", 9999);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
Client = null;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-01 16:47:58 +00:00
|
|
|
|
Thread thd = new Thread(new ThreadStart(delegate
|
|
|
|
|
{
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2010-03-04 14:54:20 +00:00
|
|
|
|
if (ChangeIcon)
|
|
|
|
|
{
|
|
|
|
|
IntPtr pt = Process.GetCurrentProcess().MainWindowHandle;
|
|
|
|
|
if (pt.ToInt64() != 0)
|
|
|
|
|
{
|
|
|
|
|
NativeMethods.SetClassLong(pt, -14, Resources.AppIcon.Handle.ToInt64());
|
|
|
|
|
ChangeIcon = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-03-01 16:47:58 +00:00
|
|
|
|
Int32 tmp = NativeMethods.GetAsyncKeyState(0x1b) & 0xf;
|
|
|
|
|
if (tmp != 0)
|
|
|
|
|
Process.GetCurrentProcess().Kill();
|
|
|
|
|
Thread.Sleep(16);
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
thd.IsBackground = true;
|
|
|
|
|
thd.Start();
|
|
|
|
|
|
|
|
|
|
// Retrieve parameters
|
|
|
|
|
String DLLPath = args[0];
|
|
|
|
|
String DumpPath = args[1];
|
|
|
|
|
String Operation = args[2];
|
2010-03-04 13:47:36 +00:00
|
|
|
|
Int32 Renderer = Convert.ToInt32(args[3]);
|
2010-03-01 16:47:58 +00:00
|
|
|
|
|
2010-03-04 14:54:20 +00:00
|
|
|
|
GSDXWrapper wrap = new GSDXWrapper();
|
|
|
|
|
wrap.Load(DLLPath);
|
2010-12-19 10:48:09 +00:00
|
|
|
|
Directory.SetCurrentDirectory(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\" + Path.GetFileName(DLLPath) + "\\"));
|
2010-03-04 14:54:20 +00:00
|
|
|
|
if (Operation == "GSReplay")
|
2010-03-01 16:47:58 +00:00
|
|
|
|
{
|
2010-12-19 15:55:52 +00:00
|
|
|
|
dump = GSDump.LoadDump(DumpPath);
|
2010-12-19 14:41:11 +00:00
|
|
|
|
wrap.Run(dump, Renderer);
|
2010-03-04 14:54:20 +00:00
|
|
|
|
ChangeIcon = true;
|
2010-03-01 16:47:58 +00:00
|
|
|
|
}
|
2010-03-04 14:54:20 +00:00
|
|
|
|
else
|
|
|
|
|
wrap.GSConfig();
|
|
|
|
|
wrap.Unload();
|
2010-12-19 15:55:52 +00:00
|
|
|
|
|
2010-12-21 07:29:33 +00:00
|
|
|
|
if (GSDXWrapper.DumpTooOld)
|
|
|
|
|
{
|
|
|
|
|
if (Client != null)
|
|
|
|
|
{
|
|
|
|
|
TCPMessage msg = new TCPMessage();
|
|
|
|
|
msg.MessageType = MessageType.StateOld;
|
|
|
|
|
Client.Send(msg);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-19 15:55:52 +00:00
|
|
|
|
if (Client != null)
|
|
|
|
|
Client.Disconnect();
|
2010-03-01 16:47:58 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2010-12-19 15:55:52 +00:00
|
|
|
|
Clients = new List<TCPLibrary.MessageBased.Core.BaseMessageClientS>();
|
|
|
|
|
|
|
|
|
|
Server = new TCPLibrary.MessageBased.Core.BaseMessageServer();
|
|
|
|
|
Server.OnClientMessageReceived += new BaseMessageServer.MessageReceivedHandler(Server_OnClientMessageReceived);
|
|
|
|
|
Server.OnClientAfterConnect += new TCPLibrary.Core.Server.ConnectedHandler(Server_OnClientAfterConnect);
|
|
|
|
|
Server.OnClientAfterDisconnected += new TCPLibrary.Core.Server.DisconnectedHandler(Server_OnClientAfterDisconnected);
|
|
|
|
|
Server.Port = 9999;
|
|
|
|
|
Server.Enabled = true;
|
|
|
|
|
|
2010-03-01 16:47:58 +00:00
|
|
|
|
Application.EnableVisualStyles();
|
|
|
|
|
Application.SetCompatibleTextRenderingDefault(false);
|
|
|
|
|
frmMain = new GSDumpGUI();
|
|
|
|
|
Application.Run(frmMain);
|
2010-12-19 15:55:52 +00:00
|
|
|
|
|
|
|
|
|
Server.Enabled = false;
|
2010-03-01 16:47:58 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2010-12-19 15:55:52 +00:00
|
|
|
|
|
|
|
|
|
static void Server_OnClientAfterDisconnected(TCPLibrary.Core.Server server, TCPLibrary.Core.ClientS sender)
|
|
|
|
|
{
|
|
|
|
|
Clients.Remove((TCPLibrary.MessageBased.Core.BaseMessageClientS)sender);
|
|
|
|
|
RefreshList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void Server_OnClientMessageReceived(BaseMessageServer server, BaseMessageClientS sender, TCPMessage Mess)
|
|
|
|
|
{
|
|
|
|
|
switch (Mess.MessageType)
|
|
|
|
|
{
|
|
|
|
|
case MessageType.Connect:
|
|
|
|
|
break;
|
|
|
|
|
case MessageType.MaxUsers:
|
|
|
|
|
break;
|
|
|
|
|
case MessageType.SizeDump:
|
|
|
|
|
frmMain.Invoke(new Action<object>(delegate(object e)
|
|
|
|
|
{
|
2010-12-19 21:32:09 +00:00
|
|
|
|
frmMain.txtDumpSize.Text = (((int)Mess.Parameters[0]) / 1024f / 1024f).ToString("F2") + " MB";
|
|
|
|
|
}), new object[] { null });
|
|
|
|
|
break;
|
|
|
|
|
case MessageType.Statistics:
|
|
|
|
|
frmMain.Invoke(new Action<object>(delegate(object e)
|
|
|
|
|
{
|
|
|
|
|
frmMain.txtGIFPackets.Text = ((int)Mess.Parameters[0]).ToString();
|
|
|
|
|
frmMain.txtPath1.Text = ((int)Mess.Parameters[1]).ToString();
|
|
|
|
|
frmMain.txtPath2.Text = ((int)Mess.Parameters[2]).ToString();
|
|
|
|
|
frmMain.txtPath3.Text = ((int)Mess.Parameters[3]).ToString();
|
|
|
|
|
frmMain.txtReadFifo.Text = ((int)Mess.Parameters[5]).ToString();
|
|
|
|
|
frmMain.txtVSync.Text = ((int)Mess.Parameters[4]).ToString();
|
|
|
|
|
frmMain.txtRegisters.Text = ((int)Mess.Parameters[6]).ToString();
|
2010-12-19 15:55:52 +00:00
|
|
|
|
}), new object[] { null });
|
|
|
|
|
break;
|
2010-12-21 07:29:33 +00:00
|
|
|
|
case MessageType.StateOld:
|
|
|
|
|
frmMain.Invoke(new Action<object>(delegate(object e)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show("Savestate too old to be read. :(", "Warning");
|
2010-12-21 08:07:43 +00:00
|
|
|
|
frmMain.Focus();
|
2010-12-21 07:29:33 +00:00
|
|
|
|
}), new object[] { null });
|
|
|
|
|
break;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void Client_OnMessageReceived(TCPLibrary.Core.Client sender, TCPLibrary.MessageBased.Core.TCPMessage Mess)
|
|
|
|
|
{
|
2010-12-19 21:32:09 +00:00
|
|
|
|
TCPMessage msg;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
switch (Mess.MessageType)
|
|
|
|
|
{
|
|
|
|
|
case TCPLibrary.MessageBased.Core.MessageType.Connect:
|
|
|
|
|
break;
|
|
|
|
|
case TCPLibrary.MessageBased.Core.MessageType.MaxUsers:
|
|
|
|
|
break;
|
|
|
|
|
case TCPLibrary.MessageBased.Core.MessageType.SizeDump:
|
2010-12-19 21:32:09 +00:00
|
|
|
|
msg = new TCPMessage();
|
2010-12-19 15:55:52 +00:00
|
|
|
|
msg.MessageType = MessageType.SizeDump;
|
|
|
|
|
if (dump != null)
|
|
|
|
|
msg.Parameters.Add(dump.Size);
|
|
|
|
|
else
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
Client.Send(msg);
|
|
|
|
|
break;
|
2010-12-19 21:32:09 +00:00
|
|
|
|
case MessageType.Statistics:
|
|
|
|
|
msg = new TCPMessage();
|
|
|
|
|
msg.MessageType = MessageType.Statistics;
|
|
|
|
|
if (dump != null)
|
|
|
|
|
{
|
|
|
|
|
msg.Parameters.Add(dump.Data.Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && (a.data[0] == 3 || a.data[0] == 0)).Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && a.data[0] == 1).Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 0 && a.data[0] == 2).Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 1).Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 2).Count);
|
|
|
|
|
msg.Parameters.Add(dump.Data.FindAll(a => (int)a.id == 3).Count);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
msg.Parameters.Add(0);
|
|
|
|
|
}
|
|
|
|
|
Client.Send(msg);
|
|
|
|
|
break;
|
2010-12-19 15:55:52 +00:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void Server_OnClientAfterConnect(TCPLibrary.Core.Server server, TCPLibrary.Core.ClientS sender)
|
|
|
|
|
{
|
|
|
|
|
Clients.Add((TCPLibrary.MessageBased.Core.BaseMessageClientS)sender);
|
|
|
|
|
RefreshList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RefreshList()
|
|
|
|
|
{
|
|
|
|
|
frmMain.Invoke(new Action<object>( delegate(object e)
|
|
|
|
|
{
|
|
|
|
|
frmMain.lstProcesses.Items.Clear();
|
|
|
|
|
|
|
|
|
|
foreach (var itm in Clients)
|
|
|
|
|
{
|
|
|
|
|
frmMain.lstProcesses.Items.Add(itm.IPAddress);
|
|
|
|
|
}
|
|
|
|
|
}), new object[] { null});
|
|
|
|
|
}
|
2010-03-01 16:47:58 +00:00
|
|
|
|
}
|
|
|
|
|
}
|