2008-07-06 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Messaging / MethodCall.cs
index 6a44415cba33a4ff0495febb54a9e4dcbeb273d2..d925c7e909f87970a8a90ba53c7173724481dab8 100644 (file)
@@ -59,13 +59,13 @@ namespace System.Runtime.Remoting.Messaging {
                protected IDictionary ExternalProperties;
                protected IDictionary InternalProperties;
 
-               public MethodCall (Header [] headers)
+               public MethodCall (Header [] h1)
                {
                        Init();
 
-                       if (headers == null || headers.Length == 0) return;
+                       if (h1 == null || h1.Length == 0) return;
 
-                       foreach (Header header in headers)
+                       foreach (Header header in h1)
                                InitMethodProperty (header.Name, header.Value);
 
                        ResolveMethod ();
@@ -272,6 +272,11 @@ namespace System.Runtime.Remoting.Messaging {
                        set { _uri = value; }
                }
 
+               string IInternalMessage.Uri {
+                       get { return Uri; }
+                       set { Uri = value; }
+               }
+
                public object GetArg (int argNum)
                {
                        return _args[argNum];
@@ -315,22 +320,25 @@ namespace System.Runtime.Remoting.Messaging {
                                }
 
                                Type requestType = CastTo (_typeName, type);
+                               if (requestType == null)
+                                       throw new RemotingException ("Cannot cast from client type '" + _typeName + "' to server type '" + type.FullName + "'");
+
+                               // Look for the method in the requested type. The method signature is provided
+                               // only if the method is overloaded in the requested type.
+                               _methodBase = RemotingServices.GetMethodBaseFromName (requestType, _methodName, _methodSignature);
+
+                               if (_methodBase == null)
+                                       throw new RemotingException ("Method " + _methodName + " not found in " + requestType);
 
-                               if (requestType != null) {
-                                       // Look for the method in the requested type. The method signature is provided
-                                       // only if the method is overloaded in the requested type.
-                                       _methodBase = RemotingServices.GetMethodBaseFromName (requestType, _methodName, _methodSignature);
+                               // If the method is implemented in an interface, look for the method implementation.
+                               // It can't be done in the previous GetMethodBaseFromName call because at that point we
+                               // may not yet have the method signature.
+                               if (requestType != type && requestType.IsInterface && !type.IsInterface) {
+                                       _methodBase = RemotingServices.GetVirtualMethod (type, _methodBase);
                                        if (_methodBase == null)
                                                throw new RemotingException ("Method " + _methodName + " not found in " + type);
-                                       
-                                       // If the method is implemented in an interface, look for the method implementation.
-                                       // It can't be done in the previous GetMethodBaseFromName call because at that point we
-                                       // may not yet have the method signature.
-                                       if (requestType != type && requestType.IsInterface)
-                                               _methodBase = RemotingServices.GetMethodBaseFromName (type, _methodName, (Type[]) MethodSignature);
                                }
-                               else
-                                       throw new RemotingException ("Cannot cast from client type '" + _typeName + "' to server type '" + type.FullName + "'");
+
                        } else {
                                _methodBase = RemotingServices.GetMethodBaseFromMethodMessage (this);
                                if (_methodBase == null) throw new RemotingException ("Method " + _methodName + " not found in " + TypeName);
@@ -344,7 +352,6 @@ namespace System.Runtime.Remoting.Messaging {
                                _methodBase = ((MethodInfo) _methodBase).MakeGenericMethod (GenericArguments);
                        }
 #endif
-
                }
 
                Type CastTo (string clientType, Type serverType)
@@ -382,7 +389,7 @@ namespace System.Runtime.Remoting.Messaging {
                }
                
                [MonoTODO]
-               public void RootSetObjectData (SerializationInfo info, StreamingContext context)
+               public void RootSetObjectData (SerializationInfo info, StreamingContext ctx)
                {
                        throw new NotImplementedException ();
                }
@@ -393,6 +400,7 @@ namespace System.Runtime.Remoting.Messaging {
                        set { _targetIdentity = value; }
                }
 
+#if !NET_2_0
                public override string ToString ()
                {
                        string s = _typeName.Split(',')[0] + "." + _methodName + " (";
@@ -410,6 +418,7 @@ namespace System.Runtime.Remoting.Messaging {
                        s += ")";
                        return s;
                }
+#endif
 
 #if NET_2_0
                Type[] GenericArguments {