using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using BepInEx.Bootstrap;
namespace BepInEx
{
///
/// Data class that represents information about a loadable BepInEx plugin.
/// Contains all metadata and additional info required for plugin loading by .
///
public class PluginInfo : ICacheable
{
///
/// General metadata about a plugin.
///
public BepInPlugin Metadata { get; internal set; }
///
/// Collection of attributes that describe what processes the plugin can run on.
///
public IEnumerable Processes { get; internal set; }
///
/// Collection of attributes that describe what plugins this plugin depends on.
///
public IEnumerable Dependencies { get; internal set; }
///
/// Collection of attributes that describe what plugins this plugin
/// is incompatible with.
///
public IEnumerable Incompatibilities { get; internal set; }
///
/// File path to the plugin DLL
///
public string Location { get; internal set; }
///
/// Instance of the plugin that represents this info. NULL if no plugin is instantiated from info (yet)
///
public object Instance { get; internal set; }
public string TypeName { get; internal set; }
internal Version TargettedBepInExVersion { get; set; }
void ICacheable.Save(BinaryWriter bw)
{
bw.Write(TypeName);
bw.Write(Location);
bw.Write(Metadata.GUID);
bw.Write(Metadata.Name);
bw.Write(Metadata.Version.ToString());
var processList = Processes.ToList();
bw.Write(processList.Count);
foreach (var bepInProcess in processList)
bw.Write(bepInProcess.ProcessName);
var depList = Dependencies.ToList();
bw.Write(depList.Count);
foreach (var bepInDependency in depList)
((ICacheable)bepInDependency).Save(bw);
var incList = Incompatibilities.ToList();
bw.Write(incList.Count);
foreach (var bepInIncompatibility in incList)
((ICacheable)bepInIncompatibility).Save(bw);
bw.Write(TargettedBepInExVersion.ToString(4));
}
void ICacheable.Load(BinaryReader br)
{
TypeName = br.ReadString();
Location = br.ReadString();
Metadata = new BepInPlugin(br.ReadString(), br.ReadString(), br.ReadString());
var processListCount = br.ReadInt32();
var processList = new List(processListCount);
for (int i = 0; i < processListCount; i++)
processList.Add(new BepInProcess(br.ReadString()));
Processes = processList;
var depCount = br.ReadInt32();
var depList = new List(depCount);
for (int i = 0; i < depCount; i++)
{
var dep = new BepInDependency("");
((ICacheable)dep).Load(br);
depList.Add(dep);
}
Dependencies = depList;
var incCount = br.ReadInt32();
var incList = new List(incCount);
for (int i = 0; i < incCount; i++)
{
var inc = new BepInIncompatibility("");
((ICacheable)inc).Load(br);
incList.Add(inc);
}
Incompatibilities = incList;
TargettedBepInExVersion = new Version(br.ReadString());
}
///
public override string ToString() => $"{Metadata?.Name} {Metadata?.Version}";
}
}