using System; using System.Collections; using System.IO; using System.Reflection; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; using System.Threading; namespace System.Runtime.Remoting.Channels { // Token: 0x0200039B RID: 923 [MonoTODO("Handle domain unloading?")] internal class CrossAppDomainSink : IMessageSink { // Token: 0x0600258C RID: 9612 RVA: 0x0007C98C File Offset: 0x0007AB8C internal CrossAppDomainSink(int domainID) { this._domainID = domainID; } // Token: 0x0600258E RID: 9614 RVA: 0x0007C9C4 File Offset: 0x0007ABC4 internal static CrossAppDomainSink GetSink(int domainID) { object syncRoot = CrossAppDomainSink.s_sinks.SyncRoot; CrossAppDomainSink crossAppDomainSink; lock (syncRoot) { if (CrossAppDomainSink.s_sinks.ContainsKey(domainID)) { crossAppDomainSink = (CrossAppDomainSink)CrossAppDomainSink.s_sinks[domainID]; } else { CrossAppDomainSink crossAppDomainSink2 = new CrossAppDomainSink(domainID); CrossAppDomainSink.s_sinks[domainID] = crossAppDomainSink2; crossAppDomainSink = crossAppDomainSink2; } } return crossAppDomainSink; } // Token: 0x170006FD RID: 1789 // (get) Token: 0x0600258F RID: 9615 RVA: 0x0007CA5C File Offset: 0x0007AC5C internal int TargetDomainId { get { return this._domainID; } } // Token: 0x06002590 RID: 9616 RVA: 0x0007CA64 File Offset: 0x0007AC64 private static CrossAppDomainSink.ProcessMessageRes ProcessMessageInDomain(byte[] arrRequest, CADMethodCallMessage cadMsg) { CrossAppDomainSink.ProcessMessageRes processMessageRes = default(CrossAppDomainSink.ProcessMessageRes); try { AppDomain.CurrentDomain.ProcessMessageInDomain(arrRequest, cadMsg, out processMessageRes.arrResponse, out processMessageRes.cadMrm); } catch (Exception ex) { IMessage message = new MethodResponse(ex, new ErrorMessage()); processMessageRes.arrResponse = CADSerializer.SerializeMessage(message).GetBuffer(); } return processMessageRes; } // Token: 0x06002591 RID: 9617 RVA: 0x0007CADC File Offset: 0x0007ACDC public virtual IMessage SyncProcessMessage(IMessage msgRequest) { IMessage message = null; try { byte[] array = null; byte[] array2 = null; CADMethodReturnMessage cadmethodReturnMessage = null; CADMethodCallMessage cadmethodCallMessage = CADMethodCallMessage.Create(msgRequest); if (cadmethodCallMessage == null) { MemoryStream memoryStream = CADSerializer.SerializeMessage(msgRequest); array2 = memoryStream.GetBuffer(); } Context currentContext = Thread.CurrentContext; try { CrossAppDomainSink.ProcessMessageRes processMessageRes = (CrossAppDomainSink.ProcessMessageRes)AppDomain.InvokeInDomainByID(this._domainID, CrossAppDomainSink.processMessageMethod, null, new object[] { array2, cadmethodCallMessage }); array = processMessageRes.arrResponse; cadmethodReturnMessage = processMessageRes.cadMrm; } finally { AppDomain.InternalSetContext(currentContext); } if (array != null) { MemoryStream memoryStream2 = new MemoryStream(array); message = CADSerializer.DeserializeMessage(memoryStream2, msgRequest as IMethodCallMessage); } else { message = new MethodResponse(msgRequest as IMethodCallMessage, cadmethodReturnMessage); } } catch (Exception ex) { try { message = new ReturnMessage(ex, msgRequest as IMethodCallMessage); } catch (Exception) { } } return message; } // Token: 0x06002592 RID: 9618 RVA: 0x0007CBFC File Offset: 0x0007ADFC public virtual IMessageCtrl AsyncProcessMessage(IMessage reqMsg, IMessageSink replySink) { AsyncRequest asyncRequest = new AsyncRequest(reqMsg, replySink); ThreadPool.QueueUserWorkItem(new WaitCallback(this.SendAsyncMessage), asyncRequest); return null; } // Token: 0x06002593 RID: 9619 RVA: 0x0007CC28 File Offset: 0x0007AE28 public void SendAsyncMessage(object data) { AsyncRequest asyncRequest = (AsyncRequest)data; IMessage message = this.SyncProcessMessage(asyncRequest.MsgRequest); asyncRequest.ReplySink.SyncProcessMessage(message); } // Token: 0x170006FE RID: 1790 // (get) Token: 0x06002594 RID: 9620 RVA: 0x0007CC58 File Offset: 0x0007AE58 public IMessageSink NextSink { get { return null; } } // Token: 0x04000EBB RID: 3771 private static Hashtable s_sinks = new Hashtable(); // Token: 0x04000EBC RID: 3772 private static MethodInfo processMessageMethod = typeof(CrossAppDomainSink).GetMethod("ProcessMessageInDomain", BindingFlags.Static | BindingFlags.NonPublic); // Token: 0x04000EBD RID: 3773 private int _domainID; // Token: 0x0200039C RID: 924 private struct ProcessMessageRes { // Token: 0x04000EBE RID: 3774 public byte[] arrResponse; // Token: 0x04000EBF RID: 3775 public CADMethodReturnMessage cadMrm; } } }