Skip to content

Commit 8ce53f4

Browse files
committed
Introduce Olewoo IDL generation and listener, implement the first version of listener
1 parent a01e9ea commit 8ce53f4

File tree

8 files changed

+128
-7
lines changed

8 files changed

+128
-7
lines changed

Rubberduck.Deployment/BuildRegistryScript.ps1

+9-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ try
4646
foreach($file in $files)
4747
{
4848
$dllFile = [System.String]$file;
49+
$idlFile = [System.String]($file -replace ".dll", ".idl");
4950
$tlb32File = [System.String]($file -replace ".dll", ".x32.tlb");
5051
$tlb64File = [System.String]($file -replace ".dll", ".x64.tlb");
5152

@@ -63,15 +64,21 @@ try
6364
# For simplicity, the arguments are pass in literally.
6465
# & "C:\GitHub\Rubberduck\Rubberduck\Rubberduck.Deployment\echoargs.exe" ""$sourceDll"" /win32 /out:""$sourceTlb"";
6566

67+
[System.Reflection.Assembly]::LoadFrom($builderAssemblyPath);
68+
$idlGenerator = New-Object Rubberduck.Deployment.IdlGeneration.IdlGenerator;
69+
70+
$idl = $idlGenerator.GenerateIdl($sourceDll);
71+
$encoding = New-Object System.Text.UTF8Encoding $true;
72+
[System.IO.File]::WriteAllLines($idlFile, $idl, $encoding);
73+
6674
$cmd = "{0}tlbexp.exe" -f $netToolsDir;
6775
& $cmd ""$sourceDll"" /win32 /out:""$sourceTlb32"";
6876
& $cmd ""$sourceDll"" /win64 /out:""$sourceTlb64"";
6977

7078
$cmd = "{0}heat.exe" -f $wixToolsDir;
7179
& $cmd file ""$sourceDll"" -out ""$dllXml"";
7280
& $cmd file ""$sourceTlb32"" -out ""$tlbXml"";
73-
74-
[System.Reflection.Assembly]::LoadFrom($builderAssemblyPath);
81+
7582
$builder = New-Object Rubberduck.Deployment.Builders.RegistryEntryBuilder;
7683

7784
$entries = $builder.Parse($tlbXml, $dllXml);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Linq;
3+
using Org.Benf.OleWoo;
4+
using Org.Benf.OleWoo.Typelib;
5+
using System.IO;
6+
using System.Reflection;
7+
using System.Runtime.InteropServices;
8+
using System.Runtime.InteropServices.ComTypes;
9+
10+
namespace Rubberduck.Deployment.IdlGeneration
11+
{
12+
public class IdlGenerator
13+
{
14+
public string GenerateIdl(string assemblyPath)
15+
{
16+
System.Diagnostics.Debugger.Launch();
17+
18+
try
19+
{
20+
if (File.Exists(assemblyPath))
21+
{
22+
var assembly = Assembly.LoadFrom(assemblyPath);
23+
return GenerateIdl(assembly);
24+
}
25+
}
26+
catch (Exception ex)
27+
{
28+
Console.WriteLine(ex);
29+
throw;
30+
}
31+
32+
return string.Empty;
33+
}
34+
35+
public string GenerateIdl(Assembly assembly)
36+
{
37+
var converter = new TypeLibConverter();
38+
var sink = new TypeLibExporterNotifySink();
39+
var lib = (ITypeLib) converter.ConvertAssemblyToTypeLib(assembly, assembly.GetName().Name,
40+
TypeLibExporterFlags.ExportAs32Bit, sink);
41+
var formatter = new PlainIDLFormatter();
42+
var owLib = new OWTypeLib(lib);
43+
owLib.Listeners.Add(new IdlListener());
44+
45+
owLib.BuildIDLInto(formatter);
46+
return formatter.ToString();
47+
}
48+
}
49+
50+
public class TypeLibExporterNotifySink : ITypeLibExporterNotifySink
51+
{
52+
public void ReportEvent(ExporterEventKind eventKind, int eventCode, string eventMsg)
53+
{
54+
// no-op
55+
}
56+
57+
public object ResolveRef(Assembly assembly)
58+
{
59+
var converter = new TypeLibConverter();
60+
var lib = converter.ConvertAssemblyToTypeLib(assembly, assembly.GetName().Name,
61+
TypeLibExporterFlags.ExportAs32Bit, this);
62+
return lib;
63+
}
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using Org.Benf.OleWoo.Listeners;
2+
using Org.Benf.OleWoo.Typelib;
3+
4+
namespace Rubberduck.Deployment.IdlGeneration
5+
{
6+
public class IdlListener : TypeLibListenerBase
7+
{
8+
public override void EnterTypeLib(ITlibNode libNode)
9+
{
10+
libNode.Data.Name = libNode.Data.Name.Replace("_", string.Empty);
11+
libNode.Data.ShortName = libNode.Data.ShortName.Replace("_", string.Empty);
12+
}
13+
14+
public override void EnterCoClass(ITlibNode coClassNode)
15+
{
16+
if (coClassNode.ShortName.StartsWith("_"))
17+
{
18+
coClassNode.Data.Attributes.Add("hidden");
19+
}
20+
}
21+
22+
public override void EnterInterface(ITlibNode interfaceNode)
23+
{
24+
if (interfaceNode.Parent.Name.StartsWith("_"))
25+
{
26+
interfaceNode.Data.Attributes.Remove("default");
27+
interfaceNode.Data.Attributes.Add("restricted");
28+
}
29+
}
30+
31+
public override void EnterDispInterface(ITlibNode dispInterfaceNode)
32+
{
33+
if (dispInterfaceNode.Parent.Name.StartsWith("_"))
34+
{
35+
dispInterfaceNode.Data.Attributes.Remove("default");
36+
dispInterfaceNode.Data.Attributes.Add("restricted");
37+
}
38+
}
39+
40+
public override void EnterEnumValue(ITlibNode enumValueNode)
41+
{
42+
var unwantedPrefix = enumValueNode.Parent.Data.ShortName + "_";
43+
enumValueNode.Data.Name = enumValueNode.Data.Name.Replace(unwantedPrefix, "rd");
44+
enumValueNode.Data.ShortName = enumValueNode.Data.ShortName.Replace(unwantedPrefix, "rd");
45+
}
46+
}
47+
}
5.5 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
3-
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup></configuration>
3+
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
Binary file not shown.

Rubberduck.Deployment/Rubberduck.Deployment.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
<Reference Include="System.Xml" />
4848
</ItemGroup>
4949
<ItemGroup>
50+
<Compile Include="IdlGeneration\IdlGenerator.cs" />
51+
<Compile Include="IdlGeneration\IdlListener.cs" />
5052
<Compile Include="Structs\Bitness.cs" />
5153
<Compile Include="Structs\ClassMap.cs" />
5254
<Compile Include="Structs\FileMap.cs" />

Rubberduck.Deployment/app.config

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<runtime>
44
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
55
<dependentAssembly>
6-
<assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
7-
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
6+
<assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral"/>
7+
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
88
</dependentAssembly>
99
</assemblyBinding>
1010
</runtime>
11-
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /></startup></configuration>
11+
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>

0 commit comments

Comments
 (0)