1 // 2 // LayeredOutputChannel.cs 3 // 4 // Author: Atsushi Enomoto (atsushi@ximian.com) 5 // 6 // Copyright (C) 2006 Novell, Inc (http://www.novell.com) 7 // 8 // Permission is hereby granted, free of charge, to any person obtaining 9 // a copy of this software and associated documentation files (the 10 // "Software"), to deal in the Software without restriction, including 11 // without limitation the rights to use, copy, modify, merge, publish, 12 // distribute, sublicense, and/or sell copies of the Software, and to 13 // permit persons to whom the Software is furnished to do so, subject to 14 // the following conditions: 15 // 16 // The above copyright notice and this permission notice shall be 17 // included in all copies or substantial portions of the Software. 18 // 19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 // 27 using System; 28 using System.ServiceModel; 29 30 namespace System.ServiceModel.Channels 31 { 32 internal abstract class LayeredOutputChannel : LayeredCommunicationObject, IOutputChannel 33 { 34 IOutputChannel inner; 35 LayeredOutputChannel(IOutputChannel source)36 public LayeredOutputChannel (IOutputChannel source) 37 : base (source) 38 { 39 inner = source; 40 } 41 42 public abstract ChannelFactoryBase Factory { get; } 43 44 public override ChannelManagerBase ChannelManager { 45 get { return Factory; } 46 } 47 48 // IOutputChannel 49 public virtual EndpointAddress RemoteAddress { 50 get { return inner.RemoteAddress; } 51 } 52 BeginSend(Message message, AsyncCallback callback, object state)53 public IAsyncResult BeginSend (Message message, AsyncCallback callback, object state) 54 { 55 // FIXME: send + receive? 56 return BeginSend (message, Factory.DefaultSendTimeout, callback, state); 57 } 58 BeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state)59 public virtual IAsyncResult BeginSend (Message message, TimeSpan timeout, AsyncCallback callback, object state) 60 { 61 ThrowIfNotOpen (); 62 return OnBeginSend (message, timeout, callback, state); 63 } 64 OnBeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state)65 protected virtual IAsyncResult OnBeginSend (Message message, TimeSpan timeout, AsyncCallback callback, object state) 66 { 67 return inner.BeginSend (message, timeout, callback, state); 68 } 69 EndSend(IAsyncResult result)70 public void EndSend (IAsyncResult result) 71 { 72 OnEndSend (result); 73 } 74 OnEndSend(IAsyncResult result)75 protected virtual void OnEndSend (IAsyncResult result) 76 { 77 inner.EndSend (result); 78 } 79 Send(Message message)80 public void Send (Message message) 81 { 82 // FIXME: send + receive? 83 Send (message, Factory.DefaultSendTimeout); 84 } 85 Send(Message message, TimeSpan timeout)86 public void Send (Message message, TimeSpan timeout) 87 { 88 ThrowIfNotOpen (); 89 OnSend (message, timeout); 90 } 91 OnSend(Message message, TimeSpan timeout)92 protected virtual void OnSend (Message message, TimeSpan timeout) 93 { 94 inner.Send (message, timeout); 95 } 96 97 public virtual Uri Via { 98 get { return inner.Via; } 99 } 100 101 // IChannel 102 103 public virtual T GetProperty<T> () where T : class 104 { 105 return inner.GetProperty<T> (); 106 } 107 } 108 } 109