comparison InteropCodeGen/Program.cs @ 6:e640ca67b819

Added extended COM interop code generator for interfaces and proxies
author Ivo Smits
date Fri, 06 May 2011 04:02:43 +0200
parents
children a7650e26195f
comparison
equal deleted inserted replaced
5:00fb4879d273 6:e640ca67b819
1 using System;
2 using System.Xml.XPath;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Runtime.InteropServices;
6
7 namespace VBoxSDK {
8 class Program {
9 public static void Main(String[] args) {
10 Boolean TargetIsMono = false;
11
12 XidlParser parser = new XidlParser();
13 XPathDocument xidlDoc = new XPathDocument("VirtualBox.xidl");
14 if (TargetIsMono) {
15 parser.Types["wstring"] = new StringTypeInfo(UnmanagedType.LPWStr);
16 parser.BaseInterfaceType = parser.Library.Interfaces["IUnknown"];
17 } else {
18 parser.Types["wstring"] = new StringTypeInfo(UnmanagedType.BStr);
19 parser.BaseInterfaceType = parser.Library.Interfaces["IDispatch"];
20 }
21 parser.Parse(xidlDoc.CreateNavigator());
22 foreach (InterfaceInfo intf in parser.Library.Interfaces.Values) {
23 GnomeSort(intf.Members, delegate(InterfaceMemberInfo a, InterfaceMemberInfo b) {
24 if (b is PropertyInfo && a is MethodInfo) return 1;
25 else if (a is PropertyInfo && b is MethodInfo) return -1;
26 return 0;
27 });
28 }
29 using (TextWriter outfile = File.CreateText("Interfaces.txt")) {
30 PrintTypeTree(outfile, parser.Library);
31 }
32 using (TextWriter outfile = File.CreateText("Interfaces.cs")) {
33 outfile.WriteLine("using System;");
34 outfile.WriteLine("using System.Runtime.InteropServices;");
35 outfile.WriteLine("using System.Runtime.CompilerServices;");
36 outfile.WriteLine("namespace VirtualBox {");
37 ComInteropInterfaceGenerator igen = new ComInteropInterfaceGenerator(outfile);
38 igen.IncludeInheritedMembers = true;
39 igen.IncludeComAttributes = true;
40 igen.ComInterfaceTypeIDispatch = !TargetIsMono;
41 igen.TypeModifiers = "public";
42 igen.WriteLibrary(parser.Library);
43 outfile.WriteLine("}");
44 }
45 parser.Library.Interfaces["IUnknown"].Members.Add(new MethodInfo("QueryInterface", new ValueTypeInfo("IntPtr")));
46 (parser.Library.Interfaces["IUnknown"].Members[0] as MethodInfo).Parameters.Add(new MethodParameterInfo("riid", new ValueTypeInfo("Guid"), true, true, false));
47 parser.Library.Interfaces["IUnknown"].Members.Add(new MethodInfo("AddRef", null));
48 parser.Library.Interfaces["IUnknown"].Members.Add(new MethodInfo("Release", null));
49 parser.Library.Interfaces["IDispatch"].Members.Add(new MethodInfo("GetTypeInfoCount", null));
50 parser.Library.Interfaces["IDispatch"].Members.Add(new MethodInfo("GetTypeInfo", null));
51 parser.Library.Interfaces["IDispatch"].Members.Add(new MethodInfo("GetIDsOfNames", null));
52 parser.Library.Interfaces["IDispatch"].Members.Add(new MethodInfo("Invoke", null));
53 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy1", null));
54 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy2", null));
55 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy3", null));
56 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy4", null));
57 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy5", null));
58 if (TargetIsMono) {
59 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy6", null));
60 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy7", null));
61 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy8", null));
62 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy9", null));
63 parser.Library.Interfaces["IErrorInfo"].Members.Add(new MethodInfo("dummy10", null));
64 }
65 using (TextWriter outfile = File.CreateText("Proxy.cs")) {
66 outfile.WriteLine("using System;");
67 outfile.WriteLine("using System.Runtime.InteropServices;");
68 outfile.WriteLine("using HRESULT = System.Int32;");
69 outfile.WriteLine("namespace VirtualBox {");
70 ComInteropProxyGenerator igen = new ComInteropProxyGenerator(outfile);
71 igen.IncludeInheritedMembers = true;
72 igen.TypeModifiers = "public";
73 igen.WriteLibrary(parser.Library);
74 outfile.WriteLine("}");
75 }
76 Console.WriteLine("Done.");
77 Console.ReadLine();
78 }
79 private static void GnomeSort<T>(IList<T> a, Comparison<T> comparer) {
80 int pos = 1;
81 while (pos < a.Count) {
82 if (comparer(a[pos], a[pos - 1]) >= 0) {
83 pos++;
84 } else {
85 T tmp = a[pos];
86 a[pos] = a[pos - 1];
87 a[pos - 1] = tmp;
88 if (pos > 1) pos--; else pos++;
89 }
90 }
91 }
92 private static void PrintTypeTree(TextWriter output, LibraryInfo lib) {
93 foreach (KeyValuePair<String, EnumInfo> enumi in lib.Enums) {
94 output.WriteLine("enum {0};", enumi.Key);
95 }
96 foreach (KeyValuePair<String, InterfaceInfo> intf in lib.Interfaces) {
97 output.Write("interface {0}({1}) ", intf.Key, intf.Value.IID);
98 if (intf.Value.Extends != null) output.Write(": {0} ", intf.Value.Extends.Name);
99 output.WriteLine("{");
100 foreach (InterfaceMemberInfo member in intf.Value.Members) {
101 if (member is PropertyInfo) {
102 PropertyInfo memberi = (PropertyInfo)member;
103 output.WriteLine("property {0};", memberi.Name);
104 } else if (member is MethodInfo) {
105 MethodInfo memberi = (MethodInfo)member;
106 output.WriteLine("method {0};", memberi.Name);
107 } else {
108 output.WriteLine("unknown member;");
109 }
110 }
111 output.WriteLine("}");
112 }
113 }
114 }
115 }