Merge pull request #2248 from barsgroup/bugfix/35980
[mono.git] / mcs / class / corlib / System.Runtime.Remoting / ServerIdentity.cs
index 72c025121d028f2c048410c8602c60b8fc3b8c19..1e075d88b3647f9f3941970a7d57ed6dbc415d87 100644 (file)
@@ -34,6 +34,7 @@ using System.Runtime.Remoting.Messaging;
 using System.Runtime.Remoting.Contexts;
 using System.Runtime.Remoting.Lifetime;
 using System.Runtime.Remoting.Proxies;
+using System.Runtime.Remoting.Services;
 
 namespace System.Runtime.Remoting
 {
@@ -103,13 +104,16 @@ namespace System.Runtime.Remoting
 
                public void AttachServerObject (MarshalByRefObject serverObject, Context context)
                {
+                       DisposeServerObject();
+
                        _context = context;
                        _serverObject = serverObject;
                        
                        if (RemotingServices.IsTransparentProxy (serverObject))
                        {
                                RealProxy rp = RemotingServices.GetRealProxy (serverObject);
-                               rp.ObjectIdentity = this;
+                               if (rp.ObjectIdentity == null)
+                                       rp.ObjectIdentity = this;
                        }
                        else
                        {
@@ -140,14 +144,19 @@ namespace System.Runtime.Remoting
                        // object is marshalled again.
                        
                        if (_serverObject != null) {
+                               MarshalByRefObject obj = _serverObject;
                                _serverObject.ObjectIdentity = null;
                                _serverObject = null;
+                               _serverSink = null;
+                               TrackingServices.NotifyDisconnectedObject (obj);
                        }
                }
        }
 
        internal class ClientActivatedIdentity : ServerIdentity
        {
+               MarshalByRefObject _targetThis;
+               
                public ClientActivatedIdentity (string objectUri, Type objectType): base (objectUri, null, objectType)
                {
                }
@@ -157,6 +166,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 +184,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 +206,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 +225,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);
                }       
        }
@@ -223,8 +248,8 @@ namespace System.Runtime.Remoting
                        // SingleCallIdentity creates and disposes an instance in each call
 
                        MarshalByRefObject obj = (MarshalByRefObject)Activator.CreateInstance (_objectType, true);
-                       obj.ObjectIdentity = this;
-                       IMessageSink serverSink = _context.CreateServerObjectSinkChain(obj);
+                       if (obj.ObjectIdentity == null) obj.ObjectIdentity = this;
+                       IMessageSink serverSink = _context.CreateServerObjectSinkChain (obj, false);
                        IMessage result = serverSink.SyncProcessMessage (msg);
                        if (obj is IDisposable) ((IDisposable)obj).Dispose();
                        return result;
@@ -233,7 +258,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);
                }