158 lines
4.2 KiB
C#
158 lines
4.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|