1 //
2 // System.Runtime.Remoting.Messaging.MethodCallMessageWrapper.cs
3 //
4 // Author: Duncan Mak (duncan@ximian.com)
5 //         Lluis Sanchez Gual (lluis@ideary.com)
6 //
7 // 2002 (C) Copyright, Ximian, Inc.
8 //
9 
10 //
11 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
12 //
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:
20 //
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 //
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.
31 //
32 
33 using System;
34 using System.Collections;
35 using System.Reflection;
36 
37 namespace System.Runtime.Remoting.Messaging {
38 
39 	[System.Runtime.InteropServices.ComVisible (true)]
40 	public class MethodCallMessageWrapper : InternalMessageWrapper, IMethodCallMessage, IMethodMessage, IMessage
41 	{
42 		object[] _args;
43 		ArgInfo _inArgInfo;
44 		DictionaryWrapper _properties;
45 
MethodCallMessageWrapper(IMethodCallMessage msg)46 		public MethodCallMessageWrapper (IMethodCallMessage msg)
47 			: base (msg)
48 		{
49 			_args = ((IMethodCallMessage)WrappedMessage).Args;
50 			_inArgInfo = new ArgInfo (msg.MethodBase, ArgInfoType.In);
51 		}
52 
53 		public virtual int ArgCount {
54 			get { return ((IMethodCallMessage)WrappedMessage).ArgCount; }
55 		}
56 
57 		public virtual object [] Args {
58 			get { return _args; }
59 			set { _args = value; }
60 		}
61 
62 		public virtual bool HasVarArgs {
63 			get { return ((IMethodCallMessage)WrappedMessage).HasVarArgs; }
64 		}
65 
66 		public virtual int InArgCount {
67 			get { return _inArgInfo.GetInOutArgCount(); }
68 		}
69 
70 		public virtual object[] InArgs {
71 			get { return _inArgInfo.GetInOutArgs (_args); }
72 		}
73 
74 		public virtual LogicalCallContext LogicalCallContext {
75 			get { return ((IMethodCallMessage)WrappedMessage).LogicalCallContext; }
76 		}
77 
78 		public virtual MethodBase MethodBase {
79 			get { return ((IMethodCallMessage)WrappedMessage).MethodBase; }
80 		}
81 
82 		public virtual string MethodName {
83 			get { return ((IMethodCallMessage)WrappedMessage).MethodName; }
84 		}
85 
86 		public virtual object MethodSignature {
87 			get { return ((IMethodCallMessage)WrappedMessage).MethodSignature; }
88 		}
89 
90 		public virtual IDictionary Properties
91 		{
92 			get
93 			{
94 				if (_properties == null) _properties = new DictionaryWrapper(this, WrappedMessage.Properties);
95 				return _properties;
96 			}
97 		}
98 
99 		public virtual string TypeName {
100 			get { return ((IMethodCallMessage)WrappedMessage).TypeName; }
101 		}
102 
103 		public virtual string Uri {
104 			get { return ((IMethodCallMessage)WrappedMessage).Uri; }
105 			set {
106 				IInternalMessage im = WrappedMessage as IInternalMessage;
107 				if (im != null) im.Uri = value;
108 				else Properties["__Uri"] = value;
109 			}
110 		}
111 
GetArg(int argNum)112 		public virtual object GetArg (int argNum)
113 		{
114 			return _args[argNum];
115 		}
116 
GetArgName(int index)117 		public virtual string GetArgName (int index)
118 		{
119 			return ((IMethodCallMessage)WrappedMessage).GetArgName (index);
120 		}
121 
GetInArg(int argNum)122 		public virtual object GetInArg (int argNum)
123 		{
124 			return _args[_inArgInfo.GetInOutArgIndex (argNum)];
125 		}
126 
GetInArgName(int index)127 		public virtual string GetInArgName (int index)
128 		{
129 			return _inArgInfo.GetInOutArgName(index);
130 		}
131 
132 		class DictionaryWrapper : MCMDictionary
133 		{
134 			IDictionary _wrappedDictionary;
135 			static string[] _keys = new string[] {"__Args"};
136 
DictionaryWrapper(IMethodMessage message, IDictionary wrappedDictionary)137 			public DictionaryWrapper(IMethodMessage message, IDictionary wrappedDictionary) : base (message)
138 			{
139 				_wrappedDictionary = wrappedDictionary;
140 				MethodKeys = _keys;
141 			}
142 
AllocInternalProperties()143 			protected override IDictionary AllocInternalProperties()
144 			{
145 				return _wrappedDictionary;
146 			}
147 
SetMethodProperty(string key, object value)148 			protected override void SetMethodProperty (string key, object value)
149 			{
150 				if (key == "__Args") ((MethodCallMessageWrapper)_message)._args = (object[])value;
151 				else base.SetMethodProperty (key, value);
152 			}
153 
GetMethodProperty(string key)154 			protected override object GetMethodProperty (string key)
155 			{
156 				if (key == "__Args") return ((MethodCallMessageWrapper)_message)._args;
157 				else return base.GetMethodProperty (key);
158 			}
159 		}
160 	}
161 }
162