using System; using System.Runtime.Remoting.Messaging; using System.Threading; namespace System.Runtime.Remoting.Contexts { // Token: 0x020003BE RID: 958 internal class CrossContextChannel : IMessageSink { // Token: 0x0600261E RID: 9758 RVA: 0x0007DDC0 File Offset: 0x0007BFC0 public IMessage SyncProcessMessage(IMessage msg) { ServerIdentity serverIdentity = (ServerIdentity)RemotingServices.GetMessageTargetIdentity(msg); Context context = null; if (Thread.CurrentContext != serverIdentity.Context) { context = Context.SwitchToContext(serverIdentity.Context); } IMessage message; try { Context.NotifyGlobalDynamicSinks(true, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks(true, msg, false, false); message = serverIdentity.Context.GetServerContextSinkChain().SyncProcessMessage(msg); Context.NotifyGlobalDynamicSinks(false, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks(false, msg, false, false); } catch (Exception ex) { message = new ReturnMessage(ex, (IMethodCallMessage)msg); } finally { if (context != null) { Context.SwitchToContext(context); } } return message; } // Token: 0x0600261F RID: 9759 RVA: 0x0007DE94 File Offset: 0x0007C094 public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { ServerIdentity serverIdentity = (ServerIdentity)RemotingServices.GetMessageTargetIdentity(msg); Context context = null; if (Thread.CurrentContext != serverIdentity.Context) { context = Context.SwitchToContext(serverIdentity.Context); } IMessageCtrl messageCtrl2; try { Context.NotifyGlobalDynamicSinks(true, msg, false, true); Thread.CurrentContext.NotifyDynamicSinks(true, msg, false, false); if (replySink != null) { replySink = new CrossContextChannel.ContextRestoreSink(replySink, context, msg); } IMessageCtrl messageCtrl = serverIdentity.AsyncObjectProcessMessage(msg, replySink); if (replySink == null) { Context.NotifyGlobalDynamicSinks(false, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks(false, msg, false, false); } messageCtrl2 = messageCtrl; } catch (Exception ex) { if (replySink != null) { replySink.SyncProcessMessage(new ReturnMessage(ex, (IMethodCallMessage)msg)); } messageCtrl2 = null; } finally { if (context != null) { Context.SwitchToContext(context); } } return messageCtrl2; } // Token: 0x17000721 RID: 1825 // (get) Token: 0x06002620 RID: 9760 RVA: 0x0007DF90 File Offset: 0x0007C190 public IMessageSink NextSink { get { return null; } } // Token: 0x020003BF RID: 959 private class ContextRestoreSink : IMessageSink { // Token: 0x06002621 RID: 9761 RVA: 0x0007DF94 File Offset: 0x0007C194 public ContextRestoreSink(IMessageSink next, Context context, IMessage call) { this._next = next; this._context = context; this._call = call; } // Token: 0x06002622 RID: 9762 RVA: 0x0007DFB4 File Offset: 0x0007C1B4 public IMessage SyncProcessMessage(IMessage msg) { IMessage message; try { Context.NotifyGlobalDynamicSinks(false, msg, false, false); Thread.CurrentContext.NotifyDynamicSinks(false, msg, false, false); message = this._next.SyncProcessMessage(msg); } catch (Exception ex) { message = new ReturnMessage(ex, (IMethodCallMessage)this._call); } finally { if (this._context != null) { Context.SwitchToContext(this._context); } } return message; } // Token: 0x06002623 RID: 9763 RVA: 0x0007E05C File Offset: 0x0007C25C public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink) { throw new NotSupportedException(); } // Token: 0x17000722 RID: 1826 // (get) Token: 0x06002624 RID: 9764 RVA: 0x0007E064 File Offset: 0x0007C264 public IMessageSink NextSink { get { return this._next; } } // Token: 0x04000EDF RID: 3807 private IMessageSink _next; // Token: 0x04000EE0 RID: 3808 private Context _context; // Token: 0x04000EE1 RID: 3809 private IMessage _call; } } }