2007-05-11 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mcs / class / corlib / System.Reflection / Module.cs
index af0ad89c17327d7862d5761e87fcb80f84c1f0fe..6c136534127aeb479c74f57eea919b285d050a2e 100644 (file)
@@ -5,10 +5,7 @@
 //   Paolo Molaro (lupus@ximian.com)
 //
 // (C) 2001 Ximian, Inc.  http://www.ximian.com
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
-using System.Reflection;
 using System.Runtime.Serialization;
 using System.Security.Cryptography.X509Certificates;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.Security;
+using System.Security.Permissions;
 
 namespace System.Reflection {
 
@@ -45,8 +42,13 @@ namespace System.Reflection {
                Other
        };
 
+#if NET_2_0
+       [ComVisible (true)]
+       [ComDefaultInterfaceAttribute (typeof (_Module))]
+#endif
        [Serializable]
-       public class Module : ISerializable, ICustomAttributeProvider {
+       [ClassInterfaceAttribute (ClassInterfaceType.None)]
+       public class Module : ISerializable, ICustomAttributeProvider, _Module {
        
                public static readonly TypeFilter FilterTypeName;
                public static readonly TypeFilter FilterTypeNameIgnoreCase;
@@ -67,20 +69,24 @@ namespace System.Reflection {
                        FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
                }
 
-               internal Module () { }
-
-               ~Module () {
-                       Close ();
+               internal Module () {
                }
-       
+
                public Assembly Assembly {
                        get { return assembly; }
                }
        
                public virtual string FullyQualifiedName {
-                       get { return fqname; }
+                       get {
+                               if (SecurityManager.SecurityEnabled) {
+                                       new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fqname).Demand ();
+                               }
+                               return fqname;
+                       }
                }
-       
+
+               // Note: we do not ask for PathDiscovery because no path is returned here.
+               // However MS Fx requires it (see FDBK23572 for details).
                public string Name {
                        get { return name; }
                }
@@ -99,7 +105,12 @@ namespace System.Reflection {
                public extern int MetadataToken {
                        [MethodImplAttribute (MethodImplOptions.InternalCall)]
                        get;
-               }               
+               }
+
+               public extern int MDStreamVersion {
+                       [MethodImplAttribute (MethodImplOptions.InternalCall)]
+                       get;
+               }
 #endif
        
                public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) 
@@ -127,7 +138,8 @@ namespace System.Reflection {
                        if (IsResource ())
                                return null;
 
-                       return GetGlobalType ().GetField (name, BindingFlags.Public | BindingFlags.Static);
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetField (name, BindingFlags.Public | BindingFlags.Static) : null;
                }
        
                public FieldInfo GetField (string name, BindingFlags flags) 
@@ -135,7 +147,8 @@ namespace System.Reflection {
                        if (IsResource ())
                                return null;
 
-                       return GetGlobalType ().GetField (name, flags);
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetField (name, flags) : null;
                }
        
                public FieldInfo[] GetFields () 
@@ -143,12 +156,18 @@ namespace System.Reflection {
                        if (IsResource ())
                                return new FieldInfo [0];
 
-                       return GetGlobalType ().GetFields (BindingFlags.Public | BindingFlags.Static);
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetFields (BindingFlags.Public | BindingFlags.Static) : new FieldInfo [0];
                }
        
                public MethodInfo GetMethod (string name) 
                {
-                       return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, Type.EmptyTypes, null);
+                       // Can't call the other overloads since they call Type.GetMethod () which does a null check on the 'types' array
+                       if (IsResource ())
+                               return null;
+
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetMethod (name) : null;
                }
        
                public MethodInfo GetMethod (string name, Type[] types) 
@@ -166,7 +185,8 @@ namespace System.Reflection {
                        if (IsResource ())
                                return null;
 
-                       return GetGlobalType ().GetMethod (name, bindingAttr, binder, callConvention, types, modifiers);
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers) : null;
                }
        
                public MethodInfo[] GetMethods () 
@@ -174,11 +194,35 @@ namespace System.Reflection {
                        if (IsResource ())
                                return new MethodInfo [0];
 
-                       return GetGlobalType ().GetMethods ();
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetMethods () : new MethodInfo [0];
                }
+
+#if NET_2_0
+               public MethodInfo[] GetMethods (BindingFlags flags) {
+                       if (IsResource ())
+                               return new MethodInfo [0];
+
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetMethods (flags) : new MethodInfo [0];
+               }
+
+               public FieldInfo[] GetFields (BindingFlags flags) 
+               {
+                       if (IsResource ())
+                               return new FieldInfo [0];
+
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetFields (flags) : new FieldInfo [0];
+               }
+#endif
        
+               [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
                public virtual void GetObjectData (SerializationInfo info, StreamingContext context) 
                {
+                       if (info == null)
+                               throw new ArgumentNullException ("info");
+
                        UnitySerializationHolder.GetModuleData (this, info, context);
                }
        
@@ -191,17 +235,26 @@ namespace System.Reflection {
                                return null;
                        }
                }
-       
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public virtual Type GetType(string className) 
                {
                        return GetType (className, false, false);
                }
-       
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif 
                public virtual Type GetType(string className, bool ignoreCase) 
                {
                        return GetType (className, false, ignoreCase);
                }
        
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) 
                {
                        if (className == null)
@@ -234,17 +287,25 @@ namespace System.Reflection {
                        return name;
                }
 
-#if NET_2_0 || BOOTSTRAP_NET_2_0
-               public
-#else
-               internal
-#endif
-               Guid Mvid {
+               internal Guid MvId {
+                       get {
+                               return Mono_GetGuid (this);
+                       }
+               }
+
+#if NET_2_0
+               public Guid ModuleVersionId {
                        get {
                                return Mono_GetGuid (this);
                        }
                }
 
+               public void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine) {
+                       ModuleHandle.GetPEKind (out peKind, out machine);
+               }
+#endif
+               
+
 #if NET_2_0
                private Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
                        if (error == ResolveTokenError.OutOfRange)
@@ -263,7 +324,6 @@ namespace System.Reflection {
                                return FieldInfo.GetFieldFromHandle (new RuntimeFieldHandle (handle));
                }
 
-               [MonoTODO]
                public MemberInfo ResolveMember (int metadataToken) {
                        ResolveTokenError error;
 
@@ -303,8 +363,24 @@ namespace System.Reflection {
                        else
                                return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
                }
+
+               [MonoTODO]
+               public byte[] ResolveSignature (int metadataToken) {
+                       throw new NotImplementedException ();
+               }
 #endif
 
+               internal static Type MonoDebugger_ResolveType (Module module, int token)
+               {
+                       ResolveTokenError error;
+
+                       IntPtr handle = ResolveTypeToken (module._impl, token, out error);
+                       if (handle == IntPtr.Zero)
+                               return null;
+                       else
+                               return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
+               }
+
                // Mono Extension: returns the GUID of this module
                internal static Guid Mono_GetGuid (Module module)
                {
@@ -333,9 +409,6 @@ namespace System.Reflection {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern Type GetGlobalType ();
 
-               [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               private extern void Close ();
-
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, out ResolveTokenError error);
 
@@ -352,6 +425,29 @@ namespace System.Reflection {
                internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern void GetPEKind (IntPtr module, out PortableExecutableKind peKind, out ImageFileMachine machine);
+               internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
+
+#if NET_1_1
+               void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.GetTypeInfoCount (out uint pcTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
+                       IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
+               {
+                       throw new NotImplementedException ();
+               }
+#endif
        }
 }