//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Channels { using System; using System.Collections.Generic; using System.ServiceModel; class ContextReplyChannel : LayeredChannel, IReplyChannel { ContextExchangeMechanism contextExchangeMechanism; public ContextReplyChannel(ChannelManagerBase channelManager, IReplyChannel innerChannel, ContextExchangeMechanism contextExchangeMechanism) : base(channelManager, innerChannel) { this.contextExchangeMechanism = contextExchangeMechanism; } public EndpointAddress LocalAddress { get { return this.InnerChannel.LocalAddress; } } public IAsyncResult BeginReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state) { return this.InnerChannel.BeginReceiveRequest(timeout, callback, state); } public IAsyncResult BeginReceiveRequest(AsyncCallback callback, object state) { return this.InnerChannel.BeginReceiveRequest(callback, state); } public IAsyncResult BeginTryReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state) { return this.InnerChannel.BeginTryReceiveRequest(timeout, callback, state); } public IAsyncResult BeginWaitForRequest(TimeSpan timeout, AsyncCallback callback, object state) { return this.InnerChannel.BeginWaitForRequest(timeout, callback, state); } public RequestContext EndReceiveRequest(IAsyncResult result) { RequestContext innerContext = this.InnerChannel.EndReceiveRequest(result); if (innerContext == null) { return null; } else { return this.CreateContextChannelRequestContext(innerContext); } } public bool EndTryReceiveRequest(IAsyncResult result, out RequestContext context) { context = null; RequestContext innerContext; if (this.InnerChannel.EndTryReceiveRequest(result, out innerContext)) { if (innerContext != null) { context = this.CreateContextChannelRequestContext(innerContext); } return true; } else { return false; } } public bool EndWaitForRequest(IAsyncResult result) { return this.InnerChannel.EndWaitForRequest(result); } public RequestContext ReceiveRequest(TimeSpan timeout) { RequestContext innerContext = this.InnerChannel.ReceiveRequest(timeout); if (innerContext == null) { return null; } else { return this.CreateContextChannelRequestContext(innerContext); } } public RequestContext ReceiveRequest() { RequestContext innerContext = this.InnerChannel.ReceiveRequest(); if (innerContext == null) { return null; } else { return this.CreateContextChannelRequestContext(innerContext); } } public bool TryReceiveRequest(TimeSpan timeout, out RequestContext context) { RequestContext innerContext; if (this.InnerChannel.TryReceiveRequest(timeout, out innerContext)) { context = this.CreateContextChannelRequestContext(innerContext); return true; } else { context = null; return false; } } public bool WaitForRequest(TimeSpan timeout) { return this.InnerChannel.WaitForRequest(timeout); } ContextChannelRequestContext CreateContextChannelRequestContext(RequestContext innerContext) { ServiceContextProtocol contextProtocol = new ServiceContextProtocol(this.contextExchangeMechanism); contextProtocol.OnIncomingMessage(innerContext.RequestMessage); return new ContextChannelRequestContext(innerContext, contextProtocol, this.DefaultSendTimeout); } } }