2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Messaging / MethodCallMessageWrapper.cs
index 382e730a100202961da7aaea400a2b356645f3be..9474c038a893244d29c78b897f38d4f28d59a1f4 100644 (file)
@@ -2,10 +2,34 @@
 // System.Runtime.Remoting.Messaging.MethodCallMessageWrapper.cs
 //
 // Author: Duncan Mak (duncan@ximian.com)
+//         Lluis Sanchez Gual (lluis@ideary.com)
 //
 // 2002 (C) Copyright, Ximian, Inc.
 //
 
+//
+// 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;
@@ -14,96 +38,123 @@ namespace System.Runtime.Remoting.Messaging {
 
        public class MethodCallMessageWrapper : InternalMessageWrapper, IMethodCallMessage, IMethodMessage, IMessage
        {
+               object[] _args;
+               ArgInfo _inArgInfo;
+               DictionaryWrapper _properties;
+
                public MethodCallMessageWrapper (IMethodCallMessage msg)
                        : base (msg)
                {
-                       throw new NotImplementedException ();
+                       _args = ((IMethodCallMessage)WrappedMessage).Args;
+                       _inArgInfo = new ArgInfo (msg.MethodBase, ArgInfoType.In);
                }
                
-               [MonoTODO]
                public virtual int ArgCount {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).ArgCount; }
                }
 
-               [MonoTODO]
                public virtual object [] Args {
-                       get { throw new NotImplementedException (); }
-                       set { throw new NotImplementedException (); }
+                       get { return _args; }
+                       set { _args = value; }
                }
                
-               [MonoTODO]
                public virtual bool HasVarArgs {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).HasVarArgs; }
                }
 
-               [MonoTODO]
-               public virtual int InArgCount {
-                       get { throw new NotImplementedException (); }
+               public int InArgCount {
+                       get  { return _inArgInfo.GetInOutArgCount(); }
                }
 
-               [MonoTODO]
-               public virtual object [] InArgs {
-                       get { throw new NotImplementedException (); }
+               public object[] InArgs {
+                       get { return _inArgInfo.GetInOutArgs (_args); }
                }
                
-               [MonoTODO]
                public virtual LogicalCallContext LogicalCallContext {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).LogicalCallContext; }
                }
                
-               [MonoTODO]
                public virtual MethodBase MethodBase {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).MethodBase; }
                }
 
-               [MonoTODO]
                public virtual string MethodName {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).MethodName; }
                }
 
-               [MonoTODO]
                public virtual object MethodSignature {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).MethodSignature; }
                }
                
-               [MonoTODO]
-               public virtual IDictionary Properties {
-                       get { throw new NotImplementedException (); }
+               public virtual IDictionary Properties 
+               {
+                       get 
+                       { 
+                               if (_properties == null) _properties = new DictionaryWrapper(this, WrappedMessage.Properties);
+                               return _properties; 
+                       }
                }
 
-               [MonoTODO]
                public virtual string TypeName {
-                       get { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).TypeName; }
                }
 
-               [MonoTODO]
                public virtual string Uri {
-                       get { throw new NotImplementedException (); }
-                       set { throw new NotImplementedException (); }
+                       get { return ((IMethodCallMessage)WrappedMessage).Uri; }
+                       set {
+                               IInternalMessage im = WrappedMessage as IInternalMessage;
+                               if (im != null) im.Uri = value;
+                               else Properties["__Uri"] = value; 
+                       }
                }
 
-               [MonoTODO]
                public virtual object GetArg (int argNum)
                {
-                       throw new NotImplementedException ();
+                       return _args[argNum];
                }
 
-               [MonoTODO]
                public virtual string GetArgName (int index)
                {
-                       throw new NotImplementedException ();
+                       return ((IMethodCallMessage)WrappedMessage).GetArgName (index);
                }
 
-               [MonoTODO]
-               public virtual object GetInArg (int argNum)
+               public object GetInArg (int argNum)
                {
-                       throw new NotImplementedException ();
+                       return _args[_inArgInfo.GetInOutArgIndex (argNum)];
                }
 
-               [MonoTODO]
-               public virtual string GetInArgName (int index)
+               public string GetInArgName (int index)
                {
-                       throw new NotImplementedException ();
+                       return _inArgInfo.GetInOutArgName(index);
+               }
+
+               class DictionaryWrapper : MethodCallDictionary\r
+               {\r
+                       IDictionary _wrappedDictionary;\r
+                       static string[] _keys = new string[] {"__Args"};\r
+\r
+                       public DictionaryWrapper(IMethodMessage message, IDictionary wrappedDictionary) : base (message)\r
+                       {\r
+                               _wrappedDictionary = wrappedDictionary;\r
+                               MethodKeys = _keys;\r
+                       }\r
+
+                       protected override IDictionary AllocInternalProperties()\r
+                       {\r
+                               return _wrappedDictionary;\r
+                       }\r
+
+                       protected override void SetMethodProperty (string key, object value)
+                       {
+                               if (key == "__Args") ((MethodCallMessageWrapper)_message)._args = (object[])value;
+                               else base.SetMethodProperty (key, value);
+                       }
+
+                       protected override object GetMethodProperty (string key)
+                       {
+                               if (key == "__Args") return ((MethodCallMessageWrapper)_message)._args;
+                               else return base.GetMethodProperty (key);
+                       }
                }
        }
 }