openDecal/Managed/Decal.Adapter/Decal.Adapter.Wrappers/PluginHost.cs
erik d1442e3747 Initial commit: Complete open-source Decal rebuild
All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:27:56 +01:00

149 lines
3.2 KiB
C#

using System;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Xml;
using Decal.Interop.Core;
using Decal.Interop.Inject;
using Decal.Interop.Render;
namespace Decal.Adapter.Wrappers;
[CLSCompliant(true)]
public sealed class PluginHost : HostBase
{
private IPluginSite2 mySite;
private IPluginSite myOldSite;
[CLSCompliant(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public IPluginSite2 Underlying => mySite;
public DecalWrapper Decal
{
get
{
if (base.MyDecal == null)
{
base.MyDecal = new DecalWrapper(mySite.Decal);
}
return base.MyDecal;
}
}
public HooksWrapper Actions => CoreManager.Current.Actions;
public RenderServiceWrapper Render
{
get
{
if (base.MyRender == null)
{
base.MyRender = new RenderServiceWrapper((RenderService)GetObject("services\\DecalRender.RenderService"));
}
return base.MyRender;
}
}
internal PluginHost(PluginSite2 pSite)
{
mySite = pSite;
base.MyDecal = new DecalWrapper(mySite.Decal);
myOldSite = (IPluginSite)mySite.PluginSite;
}
protected override void Dispose(bool disposing)
{
try
{
_ = base.IsDisposed;
if (myOldSite != null)
{
Marshal.ReleaseComObject(myOldSite);
myOldSite = null;
}
if (mySite != null)
{
Marshal.ReleaseComObject(mySite);
mySite = null;
}
}
finally
{
base.Dispose(disposing);
}
}
public object GetObject(string path)
{
return ((dynamic)mySite).get_Object(path);
}
public int GetKeyboardMapping(string name)
{
return myOldSite.QueryKeyboardMap(name);
}
internal static void LoadViewHandler(IViewHandler handler)
{
if (ViewWrapper.ScanViews(handler))
{
ViewWrapper.ScanControls(handler);
ViewWrapper.ScanReferences(handler);
}
}
public ViewHandler LoadViewHandler(Type handlerType)
{
ViewHandler obj = (ViewHandler)Activator.CreateInstance(handlerType, this);
LoadViewHandler(obj);
obj.LoadComplete();
return obj;
}
public ViewWrapper LoadViewResource(string resourcePath)
{
Assembly callingAssembly = Assembly.GetCallingAssembly();
return LoadViewResource(resourcePath, callingAssembly);
}
public ViewWrapper LoadViewResource(string resourcePath, Assembly resourceAssembly)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
if (null == resourceAssembly)
{
throw new ArgumentNullException("resourceAssembly");
}
Stream manifestResourceStream = resourceAssembly.GetManifestResourceStream(resourcePath);
XmlDocument val = new XmlDocument();
val.Load(manifestResourceStream);
return LoadView(((XmlNode)val).OuterXml);
}
public ViewWrapper LoadView(XmlElement viewSchema)
{
if (viewSchema == null)
{
throw new ArgumentNullException("viewSchema");
}
return LoadView(((XmlNode)viewSchema).OuterXml);
}
public ViewWrapper LoadView(string viewSchema)
{
View view = myOldSite.LoadView(viewSchema);
if (view != null)
{
return new ViewWrapper(view);
}
return null;
}
public object ComFilter(string progId)
{
return ((dynamic)mySite).get_Object("services\\DecalNet.NetService\\" + progId);
}
}