Merge pull request #1624 from esdrubal/getprocesstimes
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Messaging / MethodCall.cs
index 94069d1727eaa3113ab08eb50c57b0d8735bce13..1fbf7fd6c20cc2a313c2953c4b7b3f02647b78e1 100644 (file)
@@ -34,13 +34,12 @@ using System;
 using System.Collections;
 using System.Reflection;
 using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
 
 namespace System.Runtime.Remoting.Messaging {
 
        [Serializable] [CLSCompliant (false)]
-#if NET_2_0
        [System.Runtime.InteropServices.ComVisible (true)]
-#endif
        public class MethodCall : IMethodCallMessage, IMethodMessage, IMessage, ISerializable, IInternalMessage, ISerializationRootObject
        {
                string _uri;
@@ -52,20 +51,18 @@ namespace System.Runtime.Remoting.Messaging {
                LogicalCallContext _callContext;
                ArgInfo _inArgInfo;
                Identity _targetIdentity;
-#if NET_2_0
                Type[] _genericArguments;
-#endif
 
                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 ();
@@ -121,7 +118,41 @@ namespace System.Runtime.Remoting.Messaging {
                        Init();
                        ResolveMethod();
                }
-
+#if FEATURE_REMOTING
+        internal MethodCall (Object handlerObject, BinaryMethodCallMessage smuggledMsg)
+        {
+            if (handlerObject != null)
+            {
+                _uri = handlerObject as String;
+                if (_uri == null)
+                {
+                    // This must be the tranparent proxy
+                    MarshalByRefObject mbr = handlerObject as MarshalByRefObject;
+                    if (mbr != null)
+                    {
+                       throw new NotImplementedException ("MarshalByRefObject.GetIdentity");
+/*
+                        bool fServer;
+                        srvID = MarshalByRefObject.GetIdentity(mbr, out fServer) as ServerIdentity; 
+                        uri = srvID.URI;
+*/
+                    }
+                }
+            }
+
+            _typeName = smuggledMsg.TypeName;
+            _methodName = smuggledMsg.MethodName;
+            _methodSignature = (Type[])smuggledMsg.MethodSignature;
+            _args = smuggledMsg.Args;
+            _genericArguments = smuggledMsg.InstantiationArgs;
+            _callContext = smuggledMsg.LogicalCallContext;
+
+            ResolveMethod();
+
+            if (smuggledMsg.HasProperties)
+                smuggledMsg.PopulateMessageProperties(Properties);
+        }
+#endif
                internal MethodCall ()
                {
                }
@@ -148,9 +179,7 @@ namespace System.Runtime.Remoting.Messaging {
                                case "__Args" : _args = (object[]) value; return;
                                case "__CallContext" : _callContext = (LogicalCallContext) value; return;
                                case "__Uri" : _uri = (string) value; return;
-#if NET_2_0
                                case "__GenericArguments" : _genericArguments = (Type[]) value; return;
-#endif
                                default: Properties[key] = value; return;
                        }
                }
@@ -163,9 +192,7 @@ namespace System.Runtime.Remoting.Messaging {
                        info.AddValue ("__Args", _args);
                        info.AddValue ("__CallContext", _callContext);
                        info.AddValue ("__Uri", _uri);
-#if NET_2_0
                        info.AddValue ("__GenericArguments", _genericArguments);
-#endif
 
                        if (InternalProperties != null) {
                                foreach (DictionaryEntry entry in InternalProperties)
@@ -252,7 +279,7 @@ namespace System.Runtime.Remoting.Messaging {
 
                internal virtual void InitDictionary()
                {
-                       MethodCallDictionary props = new MethodCallDictionary (this);
+                       var props = new MCMDictionary (this);
                        ExternalProperties = props;
                        InternalProperties = props.GetInternalProperties();
                }
@@ -333,7 +360,7 @@ namespace System.Runtime.Remoting.Messaging {
                                // 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) {
+                               if (requestType != type && requestType.IsInterface && !type.IsInterface) {
                                        _methodBase = RemotingServices.GetVirtualMethod (type, _methodBase);
                                        if (_methodBase == null)
                                                throw new RemotingException ("Method " + _methodName + " not found in " + type);
@@ -345,13 +372,11 @@ namespace System.Runtime.Remoting.Messaging {
                        }
 
 
-#if NET_2_0
                        if (_methodBase.IsGenericMethod && _methodBase.ContainsGenericParameters) {
                                if (GenericArguments == null)
                                        throw new RemotingException ("The remoting infrastructure does not support open generic methods.");
                                _methodBase = ((MethodInfo) _methodBase).MakeGenericMethod (GenericArguments);
                        }
-#endif
                }
 
                Type CastTo (string clientType, Type serverType)
@@ -378,18 +403,14 @@ namespace System.Runtime.Remoting.Messaging {
 
                static string GetTypeNameFromAssemblyQualifiedName (string aqname)
                {
-#if NET_2_0
                        int p = aqname.IndexOf ("]]");
                        int i = aqname.IndexOf(',', p == -1 ? 0 : p + 2);
-#else
-                       int i = aqname.IndexOf(',');
-#endif
                        if (i != -1) aqname = aqname.Substring (0, i).Trim ();
                        return aqname;
                }
                
                [MonoTODO]
-               public void RootSetObjectData (SerializationInfo info, StreamingContext context)
+               public void RootSetObjectData (SerializationInfo info, StreamingContext ctx)
                {
                        throw new NotImplementedException ();
                }
@@ -400,27 +421,11 @@ namespace System.Runtime.Remoting.Messaging {
                        set { _targetIdentity = value; }
                }
 
-#if !NET_2_0
-               public override string ToString ()
+               bool IInternalMessage.HasProperties()
                {
-                       string s = _typeName.Split(',')[0] + "." + _methodName + " (";
-                       if (_args != null)
-                       {
-                               for (int n=0; n<_args.Length; n++)
-                               {
-                                       if (n>0) s+= ", ";
-                                       if (_args[n] != null) s += _args[n].GetType().Name + " ";
-                                       s += GetArgName (n);
-                                       if (_args[n] != null) s += " = {" + _args[n] + "}";
-                                       else s+=" = {null}";
-                               }
-                       }
-                       s += ")";
-                       return s;
+                       return (ExternalProperties != null) || (InternalProperties != null);
                }
-#endif
 
-#if NET_2_0
                Type[] GenericArguments {
                        get {
                                if (_genericArguments != null)
@@ -429,6 +434,5 @@ namespace System.Runtime.Remoting.Messaging {
                                return _genericArguments = MethodBase.GetGenericArguments ();
                        }
                }
-#endif
        }
 }