Merge branch 'feature-concurrent-sweep'
[mono.git] / mcs / class / corlib / System.Runtime.Remoting / TypeInfo.cs
1 //
2 // System.Runtime.Remoting.TypeInfo.cs
3 //
4 // Author: Lluis Sanchez Gual (lluis@ideary.com)
5 //
6 // (C) 2003, Lluis Sanchez Gual
7 //
8
9 //
10 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System;
33
34 namespace System.Runtime.Remoting
35 {
36         [Serializable]
37         internal class TypeInfo : IRemotingTypeInfo
38         {
39                 string serverType;
40                 string[] serverHierarchy;
41                 string[] interfacesImplemented;
42
43                 public TypeInfo(Type type)
44                 {
45                         if (type.IsInterface)
46                         {
47                                 serverType = typeof (MarshalByRefObject).AssemblyQualifiedName;
48                                 serverHierarchy = new string[0];
49                                 interfacesImplemented = new string[] { type.AssemblyQualifiedName };
50                         }
51                         else
52                         {
53                                 serverType = type.AssemblyQualifiedName;
54
55                                 // base class info
56
57                                 int baseCount = 0;
58                                 Type baseType = type.BaseType;
59                                 while (baseType != typeof (MarshalByRefObject) && baseType != null)
60                                 {
61                                         baseType = baseType.BaseType;
62                                         baseCount++;
63                                 }
64
65                                 serverHierarchy = new string[baseCount];
66                                 baseType = type.BaseType;
67                                 for (int n=0; n<baseCount; n++) 
68                                 {
69                                         serverHierarchy[n] = baseType.AssemblyQualifiedName;
70                                         baseType = baseType.BaseType;
71                                 }
72
73                                 // Interfaces info
74
75                                 Type[] interfaces = type.GetInterfaces();
76                                 interfacesImplemented = new string[interfaces.Length];
77                                 for (int n=0; n<interfaces.Length; n++)
78                                         interfacesImplemented[n] = interfaces[n].AssemblyQualifiedName;
79                         }
80                 }
81
82                 public string TypeName 
83                 {
84                         get { return serverType; }
85                         set { serverType = value; }
86                 }
87
88                 public bool CanCastTo (Type fromType, object o)
89                 {
90                         if (fromType == typeof (object)) return true;
91                         if (fromType == typeof (MarshalByRefObject)) return true;
92
93                         string fromName = fromType.AssemblyQualifiedName;
94
95                         // Find the type comparing the name of the type and the name of the assembly,
96                         // excluding version and other assembly info
97
98                         int i = fromName.IndexOf (',');
99                         if (i != -1) i = fromName.IndexOf (',', i+1);
100                         if (i != -1) fromName = fromName.Substring (0,i+1);
101                         else fromName += ",";
102
103                         if ( (serverType + ",").StartsWith (fromName)) return true;
104
105                         if (serverHierarchy != null)
106                                 foreach (string basec in serverHierarchy)
107                                         if ( (basec + ",").StartsWith (fromName)) return true;
108
109                         if (interfacesImplemented != null)
110                                 foreach (string basec in interfacesImplemented)
111                                         if ( (basec + ",").StartsWith (fromName)) return true;
112                         
113                         return false;
114                 }
115         }
116 }