annotate InteropCodeGen/ComInteropInterfaceGenerator.cs @ 7:a7650e26195f default tip

Added support for generating Com Callable Wrappers
author Ivo Smits
date Fri, 06 May 2011 08:12:43 +0200
parents e640ca67b819
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
1 ???using System;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
2 using System.Collections.Generic;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
3 using System.Text;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
4 using System.IO;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
5
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
6 namespace VBoxSDK {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
7 class ComInteropInterfaceGenerator {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
8 public TextWriter Output { get; private set; }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
9 public Boolean IncludeInheritedMembers { get; set; }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
10 public Boolean IncludeComAttributes { get; set; }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
11 public Boolean ComInterfaceTypeIDispatch { get; set; }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
12 public String TypeModifiers { get; set; }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
13
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
14 public ComInteropInterfaceGenerator(TextWriter output) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
15 Output = output;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
16 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
17 public void WriteLibrary(LibraryInfo lib) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
18 foreach (KeyValuePair<String, EnumInfo> enumi in lib.Enums) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
19 Output.WriteLine("{1} enum {0} {{", enumi.Key, TypeModifiers);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
20 foreach (KeyValuePair<String, Int32> value in enumi.Value.Values) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
21 Output.WriteLine("{0} = {1},", value.Key, value.Value);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
22 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
23 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
24 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
25 foreach (KeyValuePair<String, InterfaceInfo> intf in lib.Interfaces) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
26 if (IncludeComAttributes) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
27 if (ComInterfaceTypeIDispatch) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
28 Output.WriteLine("[InterfaceType(ComInterfaceType.InterfaceIsDual)]");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
29 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
30 Output.WriteLine("[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
31 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
32 Output.WriteLine("[Guid(\"{0}\")]", intf.Value.IID);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
33 Output.WriteLine("[ComImport()]");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
34 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
35 Output.Write("{1} interface {0} ", intf.Key, TypeModifiers);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
36 if (intf.Value.Extends != null) Output.Write(": {0} ", intf.Value.Extends.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
37 Output.WriteLine("{");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
38 WriteInterfaceMembers(intf.Value);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
39 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
40 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
41 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
42 public void WriteInterfaceMembers(InterfaceInfo intf) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
43 if (IncludeInheritedMembers && intf.Extends != null && intf.Extends.Name != "IUnknown") WriteInterfaceMembers(intf.Extends);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
44 WriteInterfaceMembers(intf.Members);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
45 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
46 public void WriteInterfaceMembers(ICollection<InterfaceMemberInfo> members) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
47 foreach (InterfaceMemberInfo member in members) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
48 if (member is PropertyInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
49 PropertyInfo memberi = (PropertyInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
50 if (!memberi.Gettable && !memberi.Settable) continue;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
51 Output.WriteLine("{0} {1} {{", memberi.Type.Name, memberi.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
52 if (memberi.Gettable) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
53 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
54 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.Type, "return");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
55 Output.WriteLine("get;");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
56 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
57 if (memberi.Settable) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
58 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
59 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.Type, "param");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
60 Output.WriteLine("set;");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
61 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
62 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
63 } else if (member is MethodInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
64 MethodInfo memberi = (MethodInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
65 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
66 if (memberi.ReturnType == null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
67 Output.Write("void ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
68 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
69 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.ReturnType, "return");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
70 Output.Write("{0} ", memberi.ReturnType.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
71 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
72 Output.Write("{0}(", memberi.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
73 Boolean first = true;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
74 foreach (MethodParameterInfo param in memberi.Parameters) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
75 if (first) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
76 first = false;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
77 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
78 Output.Write(", ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
79 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
80 if (IncludeComAttributes) WriteTypeComMarshalAttributes(param.Type, null);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
81 if (param.Output && !param.Input) Output.Write("out ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
82 else if (param.Reference) Output.Write("ref ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
83 Output.Write("{0} p{1}", param.Type.Name, param.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
84 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
85 Output.WriteLine(");");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
86 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
87 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
88 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
89 public void WriteTypeComMarshalAttributes(TypeInfo type, String paramType) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
90 String MarshalAs = null;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
91 if (type is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
92 MarshalAs = "Interface";
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
93 } else if (type is StringTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
94 MarshalAs = (type as StringTypeInfo).UnmanagedType.ToString();
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
95 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
96 if (MarshalAs != null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
97 Output.Write("[");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
98 if (paramType != null) Output.Write("{0}: ", paramType);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
99 Output.Write("MarshalAs(UnmanagedType.{0})] ", MarshalAs);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
100 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
101 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
102 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
103 }