summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs')
-rw-r--r--src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs b/src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs
new file mode 100644
index 0000000000..87dd52fd21
--- /dev/null
+++ b/src/mscorlib/src/System/Runtime/InteropServices/TCEAdapterGen/TCEAdapterGenerator.cs
@@ -0,0 +1,140 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace System.Runtime.InteropServices.TCEAdapterGen {
+ using System.Runtime.InteropServices;
+ using System;
+ using System.Reflection;
+ using System.Reflection.Emit;
+ using System.Collections;
+ using System.Threading;
+
+ internal class TCEAdapterGenerator
+ {
+ public void Process(ModuleBuilder ModBldr, ArrayList EventItfList)
+ {
+ // Store the input/output module.
+ m_Module = ModBldr;
+
+ // Generate the TCE adapters for all the event sources.
+ int NumEvItfs = EventItfList.Count;
+ for ( int cEventItfs = 0; cEventItfs < NumEvItfs; cEventItfs++ )
+ {
+ // Retrieve the event interface info.
+ EventItfInfo CurrEventItf = (EventItfInfo)EventItfList[cEventItfs];
+
+ // Retrieve the information from the event interface info.
+ Type EventItfType = CurrEventItf.GetEventItfType();
+ Type SrcItfType = CurrEventItf.GetSrcItfType();
+ String EventProviderName = CurrEventItf.GetEventProviderName();
+
+ // Generate the sink interface helper.
+ Type SinkHelperType = new EventSinkHelperWriter( m_Module, SrcItfType, EventItfType ).Perform();
+
+ // Generate the event provider.
+ new EventProviderWriter( m_Module, EventProviderName, EventItfType, SrcItfType, SinkHelperType ).Perform();
+ }
+ }
+
+ internal static void SetClassInterfaceTypeToNone(TypeBuilder tb)
+ {
+ // Create the ClassInterface(ClassInterfaceType.None) CA builder if we haven't created it yet.
+ if (s_NoClassItfCABuilder == null)
+ {
+ Type []aConsParams = new Type[1];
+ aConsParams[0] = typeof(ClassInterfaceType);
+ ConstructorInfo Cons = typeof(ClassInterfaceAttribute).GetConstructor(aConsParams);
+
+ Object[] aArgs = new Object[1];
+ aArgs[0] = ClassInterfaceType.None;
+ s_NoClassItfCABuilder = new CustomAttributeBuilder(Cons, aArgs);
+ }
+
+ // Set the class interface type to none.
+ tb.SetCustomAttribute(s_NoClassItfCABuilder);
+ }
+
+ internal static TypeBuilder DefineUniqueType(String strInitFullName, TypeAttributes attrs, Type BaseType, Type[] aInterfaceTypes, ModuleBuilder mb)
+ {
+ String strFullName = strInitFullName;
+ int PostFix = 2;
+
+ // Find the first unique name for the type.
+ for (; mb.GetType(strFullName) != null; strFullName = strInitFullName + "_" + PostFix, PostFix++);
+
+ // Define a type with the determined unique name.
+ return mb.DefineType(strFullName, attrs, BaseType, aInterfaceTypes);
+ }
+
+ internal static void SetHiddenAttribute(TypeBuilder tb)
+ {
+ if (s_HiddenCABuilder == null)
+ {
+ // Hide the type from Object Browsers
+ Type []aConsParams = new Type[1];
+ aConsParams[0] = typeof(TypeLibTypeFlags);
+ ConstructorInfo Cons = typeof(TypeLibTypeAttribute).GetConstructor(aConsParams);
+
+ Object []aArgs = new Object[1];
+ aArgs[0] = TypeLibTypeFlags.FHidden;
+ s_HiddenCABuilder = new CustomAttributeBuilder(Cons, aArgs);
+ }
+
+ tb.SetCustomAttribute(s_HiddenCABuilder);
+ }
+
+ internal static MethodInfo[] GetNonPropertyMethods(Type type)
+ {
+ MethodInfo[] aMethods = type.GetMethods();
+ ArrayList methods = new ArrayList(aMethods);
+
+ PropertyInfo[] props = type.GetProperties();
+
+ foreach(PropertyInfo prop in props)
+ {
+ MethodInfo[] accessors = prop.GetAccessors();
+ foreach (MethodInfo accessor in accessors)
+ {
+ for (int i=0; i < methods.Count; i++)
+ {
+ if ((MethodInfo)methods[i] == accessor)
+ methods.RemoveAt(i);
+ }
+ }
+ }
+
+ MethodInfo[] retMethods = new MethodInfo[methods.Count];
+ methods.CopyTo(retMethods);
+
+ return retMethods;
+ }
+
+ internal static MethodInfo[] GetPropertyMethods(Type type)
+ {
+ MethodInfo[] aMethods = type.GetMethods();
+ ArrayList methods = new ArrayList();
+
+ PropertyInfo[] props = type.GetProperties();
+
+ foreach(PropertyInfo prop in props)
+ {
+ MethodInfo[] accessors = prop.GetAccessors();
+ foreach (MethodInfo accessor in accessors)
+ {
+ methods.Add(accessor);
+ }
+ }
+
+ MethodInfo[] retMethods = new MethodInfo[methods.Count];
+ methods.CopyTo(retMethods);
+
+ return retMethods;
+ }
+
+
+ private ModuleBuilder m_Module = null;
+ private Hashtable m_SrcItfToSrcItfInfoMap = new Hashtable();
+ private static volatile CustomAttributeBuilder s_NoClassItfCABuilder = null;
+ private static volatile CustomAttributeBuilder s_HiddenCABuilder = null;
+ }
+}