* RemotingServices.cs: In InternalExecute, use MethodBase instead
authorLluis Sanchez <lluis@novell.com>
Wed, 22 Sep 2004 19:30:55 +0000 (19:30 -0000)
committerLluis Sanchez <lluis@novell.com>
Wed, 22 Sep 2004 19:30:55 +0000 (19:30 -0000)
  of MonoMethod, so it can be also used for running constructors.
* ServerIdentity.cs: Added methods for getting and setting the client
  proxy in ClientActivatedIdentity. This is needed for CBOs, since
  messages need to be dispatched using the proxy as "this", not the
  real object.

svn path=/trunk/mcs/; revision=34251

mcs/class/corlib/System.Runtime.Remoting/ChangeLog
mcs/class/corlib/System.Runtime.Remoting/RemotingServices.cs
mcs/class/corlib/System.Runtime.Remoting/ServerIdentity.cs

index 0848beac9b8d6e03397e206e72cb1d60ff78fccd..996312c3e33f04a70489fc423e8cbfe7d22e9a70 100755 (executable)
@@ -1,3 +1,12 @@
+2004-09-22  Lluis Sanchez Gual  <lluis@novell.com>
+
+       * RemotingServices.cs: In InternalExecute, use MethodBase instead
+         of MonoMethod, so it can be also used for running constructors.
+       * ServerIdentity.cs: Added methods for getting and setting the client
+         proxy in ClientActivatedIdentity. This is needed for CBOs, since
+         messages need to be dispatched using the proxy as "this", not the
+         real object.
+
 2004-09-11 Ben Maurer  <bmaurer@users.sourceforge.net>
 
        * RemotingServices.cs: use MethodBase rather than looking
index 3e97dd0b91ad36f32d5260f528cb300f16717b7e..012cb7ad2f2b1a0e47c0e63cafb378022730f4ed 100644 (file)
@@ -69,7 +69,7 @@ namespace System.Runtime.Remoting
                private RemotingServices () {}
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               internal extern static object InternalExecute (MonoMethod method, Object obj,
+               internal extern static object InternalExecute (MethodBase method, Object obj,
                                                               Object[] parameters, out object [] out_args);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
@@ -80,7 +80,7 @@ namespace System.Runtime.Remoting
                {
                        ReturnMessage result;
                        
-                       MonoMethod method = (MonoMethod) reqMsg.MethodBase;
+                       MethodBase method = reqMsg.MethodBase;
                        object oldContext = CallContext.SetCurrentCallContext (reqMsg.LogicalCallContext);
                        
                        try 
index 72c025121d028f2c048410c8602c60b8fc3b8c19..ea9e8b17b7a032be1618f5f6bad2bacd7b57d4c5 100644 (file)
@@ -148,6 +148,8 @@ namespace System.Runtime.Remoting
 
        internal class ClientActivatedIdentity : ServerIdentity
        {
+               MarshalByRefObject _targetThis;
+               
                public ClientActivatedIdentity (string objectUri, Type objectType): base (objectUri, null, objectType)
                {
                }
@@ -157,6 +159,16 @@ namespace System.Runtime.Remoting
                        return _serverObject;
                }
 
+               public MarshalByRefObject GetClientProxy ()
+               {
+                       return _targetThis;
+               }
+               
+               public void SetClientProxy (MarshalByRefObject obj)
+               {
+                       _targetThis = obj;
+               }
+
                public override void OnLifetimeExpired()
                {
                        base.OnLifetimeExpired();
@@ -165,13 +177,19 @@ namespace System.Runtime.Remoting
 
                public override IMessage SyncObjectProcessMessage (IMessage msg)
                {
-                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (_serverObject);
+                       if (_serverSink == null) {
+                               bool useProxy = _targetThis != null;
+                               _serverSink = _context.CreateServerObjectSinkChain ((useProxy ? _targetThis : _serverObject), useProxy);
+                       }
                        return _serverSink.SyncProcessMessage (msg);
                }
 
                public override IMessageCtrl AsyncObjectProcessMessage (IMessage msg, IMessageSink replySink)
                {
-                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (_serverObject);
+                       if (_serverSink == null) {
+                               bool useProxy = _targetThis != null;
+                               _serverSink = _context.CreateServerObjectSinkChain ((useProxy ? _targetThis : _serverObject), useProxy);
+                       }
                        return _serverSink.AsyncProcessMessage (msg, replySink);
                }       
        }
@@ -181,7 +199,7 @@ namespace System.Runtime.Remoting
                public SingletonIdentity (string objectUri, Context context, Type objectType): base (objectUri, context, objectType)
                {
                }
-       
+
                public MarshalByRefObject GetServerObject ()
                {
                        if (_serverObject != null) return _serverObject;
@@ -200,14 +218,14 @@ namespace System.Runtime.Remoting
                public override IMessage SyncObjectProcessMessage (IMessage msg)
                {
                        MarshalByRefObject obj = GetServerObject ();
-                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (obj);
+                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (obj, false);
                        return _serverSink.SyncProcessMessage (msg);
                }
 
                public override IMessageCtrl AsyncObjectProcessMessage (IMessage msg, IMessageSink replySink)
                {
                        MarshalByRefObject obj = GetServerObject ();
-                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (obj);
+                       if (_serverSink == null) _serverSink = _context.CreateServerObjectSinkChain (obj, false);
                        return _serverSink.AsyncProcessMessage (msg, replySink);
                }       
        }
@@ -224,7 +242,7 @@ namespace System.Runtime.Remoting
 
                        MarshalByRefObject obj = (MarshalByRefObject)Activator.CreateInstance (_objectType, true);
                        obj.ObjectIdentity = this;
-                       IMessageSink serverSink = _context.CreateServerObjectSinkChain(obj);
+                       IMessageSink serverSink = _context.CreateServerObjectSinkChain (obj, false);
                        IMessage result = serverSink.SyncProcessMessage (msg);
                        if (obj is IDisposable) ((IDisposable)obj).Dispose();
                        return result;
@@ -233,7 +251,7 @@ namespace System.Runtime.Remoting
                public override IMessageCtrl AsyncObjectProcessMessage (IMessage msg, IMessageSink replySink)
                {
                        MarshalByRefObject obj = (MarshalByRefObject)Activator.CreateInstance (_objectType, true);
-                       IMessageSink serverSink = _context.CreateServerObjectSinkChain(obj);
+                       IMessageSink serverSink = _context.CreateServerObjectSinkChain (obj, false);
                        if (obj is IDisposable) replySink = new DisposerReplySink(replySink, ((IDisposable)obj));
                        return serverSink.AsyncProcessMessage (msg, replySink);
                }