2 // System.Runtime.Remoting.Messaging.ReturnMessage.cs
5 // Dietmar Maurer (dietmar@ximian.com)
7 // (C) Ximian, Inc. http://www.ximian.com
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System
.Collections
;
35 using System
.Reflection
;
38 namespace System
.Runtime
.Remoting
.Messaging
40 public class ReturnMessage
: IMethodReturnMessage
, IMethodMessage
, IMessage
, IInternalMessage
45 LogicalCallContext _callCtx
;
49 MethodBase _methodBase
;
51 Type
[] _methodSignature
;
53 MethodReturnDictionary _properties
;
54 Identity _targetIdentity
;
57 public ReturnMessage (object returnValue
, object [] outArgs
,
58 int outArgCount
, LogicalCallContext callCtx
,
59 IMethodCallMessage request
)
61 // outArgCount tells how many values of outArgs are valid
63 _returnValue
= returnValue
;
65 _outArgsCount
= outArgCount
;
68 _methodBase
= request
.MethodBase
;
69 if (_args
== null) _args
= new object [outArgCount
];
72 public ReturnMessage (Exception exc
, IMethodCallMessage request
)
77 _methodBase
= request
.MethodBase
;
78 _args
= new object[0]; // .NET does this
87 public object [] Args
{
93 public bool HasVarArgs
{
95 return (MethodBase
.CallingConvention
| CallingConventions
.VarArgs
) != 0;
99 public LogicalCallContext LogicalCallContext
{
105 public MethodBase MethodBase
{
111 public string MethodName
{
113 if (_methodBase
!= null && _methodName
== null)
114 _methodName
= _methodBase
.Name
;
119 public object MethodSignature
{
121 if (_methodBase
!= null && _methodSignature
== null) {
122 ParameterInfo
[] parameters
= _methodBase
.GetParameters();
123 _methodSignature
= new Type
[parameters
.Length
];
124 for (int n
=0; n
<parameters
.Length
; n
++)
125 _methodSignature
[n
] = parameters
[n
].ParameterType
;
127 return _methodSignature
;
131 public virtual IDictionary Properties
{
133 if (_properties
== null) _properties
= new MethodReturnDictionary (this);
138 public string TypeName
{
141 // lazily fill in _typeName from _methodBase
142 if (_methodBase
!= null && _typeName
== null)
143 _typeName
= _methodBase
.DeclaringType
.AssemblyQualifiedName
;
159 public object GetArg (int arg_num
)
161 return _args
[arg_num
];
164 public string GetArgName (int arg_num
)
166 return _methodBase
.GetParameters()[arg_num
].Name
;
169 public Exception Exception
{
175 public int OutArgCount
{
177 if (_args
== null || _args
.Length
== 0) return 0;
178 if (_inArgInfo
== null) _inArgInfo
= new ArgInfo (MethodBase
, ArgInfoType
.Out
);
179 return _inArgInfo
.GetInOutArgCount ();
183 public object [] OutArgs
{
185 if (_outArgs
== null && _args
!= null) {
186 if (_inArgInfo
== null) _inArgInfo
= new ArgInfo (MethodBase
, ArgInfoType
.Out
);
187 _outArgs
= _inArgInfo
.GetInOutArgs (_args
);
193 public virtual object ReturnValue
{
199 public object GetOutArg (int arg_num
)
201 if (_inArgInfo
== null) _inArgInfo
= new ArgInfo (MethodBase
, ArgInfoType
.Out
);
202 return _args
[_inArgInfo
.GetInOutArgIndex (arg_num
)];
205 public string GetOutArgName (int arg_num
)
207 if (_inArgInfo
== null) _inArgInfo
= new ArgInfo (MethodBase
, ArgInfoType
.Out
);
208 return _inArgInfo
.GetInOutArgName(arg_num
);
211 Identity IInternalMessage
.TargetIdentity
213 get { return _targetIdentity; }
214 set { _targetIdentity = value; }
217 public override string ToString ()
219 string s
= TypeName
.Split(',')[0] + "." + MethodName
+ " (";
220 if (_exception
!= null)
222 s
+= "Exception)\n" + _exception
;
226 for (int n
=0; n
<OutArgs
.Length
; n
++)
229 if (OutArgs
[n
] != null) s
+= OutArgs
[n
].GetType().Name
+ " ";
230 s
+= GetOutArgName (n
);
231 if (OutArgs
[n
] != null) s
+= " = {" + OutArgs[n] + "}";