Merge pull request #1659 from alexanderkyte/stringbuilder-referencesource
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Messaging / ReturnMessage.cs
index d322235f5bfd4706a814716cab32033a91a23bd2..8b1c7be6b6bf37904fdae1f303048ba306bd49ae 100644 (file)
@@ -7,59 +7,76 @@
 // (C) Ximian, Inc.  http://www.ximian.com
 //
 
+//
+// Copyright (C) 2004 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
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.Collections;
 using System.Reflection;
 using System.IO;
 
-namespace System.Runtime.Remoting.Messaging {
-
-       [Serializable]
-       public class ReturnMessage : IMethodReturnMessage, IMethodMessage, IInternalMessage 
+namespace System.Runtime.Remoting.Messaging 
+{
+       [System.Runtime.InteropServices.ComVisible (true)]
+       public class ReturnMessage : IMethodReturnMessage, IMethodMessage, IMessage, IInternalMessage 
        {
                object[] _outArgs;
                object[] _args;
-               int _outArgsCount;
                LogicalCallContext _callCtx;
                object _returnValue;
                string _uri;
                Exception _exception;
                MethodBase _methodBase;
                string _methodName;
-               object _methodSignature;
+               Type [] _methodSignature;
                string _typeName;
                MethodReturnDictionary _properties;
                Identity _targetIdentity;
                ArgInfo _inArgInfo;
 
-               public ReturnMessage (object returnValue, object [] outArgs,
-                              int outArgCount, LogicalCallContext callCtx,
-                              IMethodCallMessage request)
+               public ReturnMessage (object ret, object [] outArgs,
+                              int outArgsCount, LogicalCallContext callCtx,
+                              IMethodCallMessage mcm)
                {
                        // outArgCount tells how many values of outArgs are valid
 
-                       _returnValue = returnValue;
+                       _returnValue = ret;
                        _args = outArgs;
-                       _outArgsCount = outArgCount;
                        _callCtx = callCtx;
-                       _uri = request.Uri;
-                       _methodBase = request.MethodBase;
-                       _methodName = request.MethodName;
-                       _methodSignature = request.MethodSignature;
-                       _typeName = request.TypeName;
-                       if (_args == null) _args = new object [outArgCount];
+                       if (mcm != null) {
+                               _uri = mcm.Uri;
+                               _methodBase = mcm.MethodBase;
+                       }
+                       if (_args == null) _args = new object [outArgsCount];
                }
 
-               public ReturnMessage (Exception exc, IMethodCallMessage request)
+               public ReturnMessage (Exception e, IMethodCallMessage mcm)
                {
-                       _exception = exc;
+                       _exception = e;
                        
-                       if (request != null)
-                       {
-                               _methodBase = request.MethodBase;
-                               _methodName = request.MethodName;
-                               _methodSignature = request.MethodSignature;
-                               _typeName = request.TypeName;
+                       if (mcm != null) {
+                               _methodBase = mcm.MethodBase;
+                               _callCtx = mcm.LogicalCallContext;
                        }
                        _args = new object[0];  // .NET does this
                }
@@ -78,12 +95,15 @@ namespace System.Runtime.Remoting.Messaging {
                
                public bool HasVarArgs {
                        get {
-                               return (MethodBase.CallingConvention | CallingConventions.VarArgs) != 0;
+                               if (_methodBase == null) return false;
+                               else return (_methodBase.CallingConvention | CallingConventions.VarArgs) != 0;
                        }
                }
 
                public LogicalCallContext LogicalCallContext {
                        get {
+                               if (_callCtx == null)
+                                       _callCtx = new LogicalCallContext ();
                                return _callCtx;
                        }
                }
@@ -96,13 +116,20 @@ namespace System.Runtime.Remoting.Messaging {
 
                public string MethodName {
                        get {
+                               if (_methodBase != null && _methodName == null)
+                                       _methodName = _methodBase.Name;
                                return _methodName;
-
                        }
                }
 
                public object MethodSignature {
                        get {
+                               if (_methodBase != null && _methodSignature == null) {
+                                       ParameterInfo[] parameters = _methodBase.GetParameters();
+                                       _methodSignature = new Type [parameters.Length];
+                                       for (int n=0; n<parameters.Length; n++)
+                                               _methodSignature[n] = parameters[n].ParameterType;
+                               }
                                return _methodSignature;
                        }
                }
@@ -116,7 +143,12 @@ namespace System.Runtime.Remoting.Messaging {
 
                public string TypeName {
                        get {
+
+                               // lazily fill in _typeName from _methodBase
+                               if (_methodBase != null && _typeName == null)
+                                       _typeName = _methodBase.DeclaringType.AssemblyQualifiedName;
                                return _typeName;
+
                        }
                }
 
@@ -130,14 +162,19 @@ namespace System.Runtime.Remoting.Messaging {
                        }
                }
 
-               public object GetArg (int arg_num)
+               string IInternalMessage.Uri {
+                       get { return Uri; }
+                       set { Uri = value; }
+               }
+
+               public object GetArg (int argNum)
                {
-                       return _args [arg_num];
+                       return _args [argNum];
                }
                
-               public string GetArgName (int arg_num)
+               public string GetArgName (int index)
                {
-                       return _methodBase.GetParameters()[arg_num].Name;
+                       return _methodBase.GetParameters()[index].Name;
                }
 
                public Exception Exception {
@@ -148,7 +185,7 @@ namespace System.Runtime.Remoting.Messaging {
 
                public int OutArgCount {
                        get {
-                               if (_args.Length == 0) return 0;
+                               if (_args == null || _args.Length == 0) return 0;
                                if (_inArgInfo == null) _inArgInfo = new ArgInfo (MethodBase, ArgInfoType.Out);
                                return _inArgInfo.GetInOutArgCount ();
                        }
@@ -156,7 +193,7 @@ namespace System.Runtime.Remoting.Messaging {
 
                public object [] OutArgs {
                        get {
-                               if (_outArgs == null) {
+                               if (_outArgs == null && _args != null) {
                                        if (_inArgInfo == null) _inArgInfo = new ArgInfo (MethodBase, ArgInfoType.Out);
                                        _outArgs = _inArgInfo.GetInOutArgs (_args);
                                }                                       
@@ -170,16 +207,16 @@ namespace System.Runtime.Remoting.Messaging {
                        }
                }
 
-               public object GetOutArg (int arg_num)
+               public object GetOutArg (int argNum)
                {
                        if (_inArgInfo == null) _inArgInfo = new ArgInfo (MethodBase, ArgInfoType.Out);
-                       return _args[_inArgInfo.GetInOutArgIndex (arg_num)];
+                       return _args[_inArgInfo.GetInOutArgIndex (argNum)];
                }
 
-               public string GetOutArgName (int arg_num)
+               public string GetOutArgName (int index)
                {
                        if (_inArgInfo == null) _inArgInfo = new ArgInfo (MethodBase, ArgInfoType.Out);
-                       return _inArgInfo.GetInOutArgName(arg_num);
+                       return _inArgInfo.GetInOutArgName (index);
                }
 
                Identity IInternalMessage.TargetIdentity
@@ -188,26 +225,14 @@ namespace System.Runtime.Remoting.Messaging {
                        set { _targetIdentity = value; }
                }
 
-               public override string ToString ()
+               bool IInternalMessage.HasProperties ()
                {
-                       string s = _typeName.Split(',')[0] + "." + _methodName + " (";
-                       if (_exception != null)
-                       {
-                               s += "Exception)\n" + _exception;
-                       }
-                       else
-                       {
-                               for (int n=0; n<OutArgs.Length; n++)
-                               {
-                                       if (n>0) s+= ", ";
-                                       if (OutArgs[n] != null) s += OutArgs[n].GetType().Name + " ";
-                                       s += GetOutArgName (n);
-                                       if (OutArgs[n] != null) s += " = {" + OutArgs[n] + "}";
-                                       else s+=" = {null}";
-                               }
-                               s += ")";
-                       }
-                       return s;
+                       return _properties != null;
+               }
+
+               internal bool HasProperties ()
+               {
+                       return _properties != null;
                }
        }
 }