2025-07-17 22:30:12 +08:00
|
|
|
using System;
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
namespace Ink_Canvas.Helpers.Plugins
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// ICCPP 插件适配器,用于加载和管理 .iccpp 格式的插件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ICCPPPluginAdapter : PluginBase
|
|
|
|
|
{
|
|
|
|
|
private readonly byte[] _pluginData;
|
|
|
|
|
private readonly string _pluginPath;
|
|
|
|
|
private readonly string _pluginName;
|
|
|
|
|
private readonly Version _pluginVersion;
|
2025-07-28 14:40:44 +08:00
|
|
|
private bool _isInitialized;
|
2025-07-17 22:30:12 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建 ICCPP 插件适配器
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="pluginPath">插件文件路径</param>
|
|
|
|
|
/// <param name="pluginData">插件文件数据</param>
|
|
|
|
|
public ICCPPPluginAdapter(string pluginPath, byte[] pluginData)
|
|
|
|
|
{
|
|
|
|
|
_pluginPath = pluginPath;
|
|
|
|
|
_pluginData = pluginData;
|
|
|
|
|
PluginPath = pluginPath;
|
|
|
|
|
|
|
|
|
|
// 从文件名获取插件名称
|
|
|
|
|
_pluginName = Path.GetFileNameWithoutExtension(pluginPath);
|
|
|
|
|
_pluginVersion = new Version(1, 0, 0); // 默认版本
|
|
|
|
|
|
|
|
|
|
// 尝试从插件数据中读取更多信息
|
|
|
|
|
TryReadPluginMetadata();
|
|
|
|
|
}
|
2025-07-18 21:51:32 +08:00
|
|
|
|
|
|
|
|
public ICCPPPluginAdapter()
|
|
|
|
|
{
|
|
|
|
|
_pluginPath = string.Empty;
|
|
|
|
|
_pluginData = new byte[0];
|
|
|
|
|
PluginPath = string.Empty;
|
|
|
|
|
_pluginName = "ICCPPPlugin";
|
|
|
|
|
_pluginVersion = new Version(1, 0, 0);
|
|
|
|
|
// 可选:初始化其他字段
|
|
|
|
|
}
|
2025-07-17 22:30:12 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 尝试从插件数据中读取元数据
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void TryReadPluginMetadata()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 这里可以根据 .iccpp 文件的实际格式解析元数据
|
|
|
|
|
// 例如,如果文件有特定的头部结构,可以在这里解析
|
|
|
|
|
|
|
|
|
|
// 示例:如果前100字节包含元数据
|
|
|
|
|
if (_pluginData.Length > 100)
|
|
|
|
|
{
|
|
|
|
|
// 解析元数据的代码...
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogHelper.WriteLogToFile($"解析插件 {_pluginName} 元数据时出错: {ex.Message}", LogHelper.LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region IPlugin 接口实现
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插件名称
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override string Name => _pluginName;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插件描述
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override string Description => $"{_pluginName} (ICCPP 格式插件)";
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插件版本
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override Version Version => _pluginVersion;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 插件作者
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override string Author => "未知";
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 是否为内置插件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override bool IsBuiltIn => false;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 初始化插件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
{
|
|
|
|
|
if (_isInitialized) return;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 这里可以添加 .iccpp 插件的初始化逻辑
|
|
|
|
|
// 例如,根据文件格式加载特定资源
|
|
|
|
|
|
2025-07-28 14:40:44 +08:00
|
|
|
LogHelper.WriteLogToFile($"ICCPP 插件 {Name} 已初始化");
|
2025-07-17 22:30:12 +08:00
|
|
|
_isInitialized = true;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogHelper.WriteLogToFile($"初始化 ICCPP 插件 {Name} 时出错: {ex.Message}", LogHelper.LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 启用插件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void Enable()
|
|
|
|
|
{
|
|
|
|
|
if (IsEnabled) return;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 这里可以添加 .iccpp 插件的启用逻辑
|
|
|
|
|
// 例如,加载动态库、注册事件等
|
|
|
|
|
|
|
|
|
|
base.Enable(); // 设置启用状态并触发事件
|
2025-07-28 14:40:44 +08:00
|
|
|
LogHelper.WriteLogToFile($"ICCPP 插件 {Name} 已启用");
|
2025-07-17 22:30:12 +08:00
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogHelper.WriteLogToFile($"启用 ICCPP 插件 {Name} 时出错: {ex.Message}", LogHelper.LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 禁用插件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void Disable()
|
|
|
|
|
{
|
|
|
|
|
if (!IsEnabled) return;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 这里可以添加 .iccpp 插件的禁用逻辑
|
|
|
|
|
// 例如,卸载动态库、注销事件等
|
|
|
|
|
|
|
|
|
|
base.Disable(); // 设置禁用状态并触发事件
|
2025-07-28 14:40:44 +08:00
|
|
|
LogHelper.WriteLogToFile($"ICCPP 插件 {Name} 已禁用");
|
2025-07-17 22:30:12 +08:00
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogHelper.WriteLogToFile($"禁用 ICCPP 插件 {Name} 时出错: {ex.Message}", LogHelper.LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 清理插件资源
|
|
|
|
|
/// </summary>
|
|
|
|
|
public override void Cleanup()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// 这里可以添加 .iccpp 插件的清理逻辑
|
|
|
|
|
// 例如,释放资源等
|
|
|
|
|
|
2025-07-28 14:40:44 +08:00
|
|
|
LogHelper.WriteLogToFile($"ICCPP 插件 {Name} 已清理资源");
|
2025-07-17 22:30:12 +08:00
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
LogHelper.WriteLogToFile($"清理 ICCPP 插件 {Name} 资源时出错: {ex.Message}", LogHelper.LogType.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|