ongoing PeerTransportBindingElement implementation.
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Channels / DuplexSessionChannelBase.cs
1 // 
2 // DuplexSessionChannelBase.cs
3 // 
4 // Author:
5 //     Marcos Cobena (marcoscobena@gmail.com)
6 // 
7 // Copyright 2007 Marcos Cobena (http://www.youcannoteatbits.org/)
8 // 
9
10 using System;
11 using System.ServiceModel.Channels;
12
13 namespace System.ServiceModel.Channels
14 {
15         internal abstract class DuplexChannelBase : ChannelBase, IDuplexChannel
16         {
17                 ChannelFactoryBase channel_factory_base;
18                 ChannelListenerBase channel_listener_base;
19                 EndpointAddress local_address;
20                 EndpointAddress remote_address;
21                 Uri via;
22                 
23                 public DuplexChannelBase (ChannelFactoryBase factory, EndpointAddress remoteAddress, Uri via) : base (factory)
24                 {
25                         channel_factory_base = factory;
26                         remote_address = remoteAddress;
27                         this.via = via;
28                 }
29                 
30                 public DuplexChannelBase (ChannelListenerBase listener) : base (listener)
31                 {
32                         channel_listener_base = listener;
33                 }
34
35                 public abstract EndpointAddress LocalAddress { get; }
36                 
37                 public EndpointAddress RemoteAddress {
38                         get { return remote_address; }
39                 }
40
41                 public Uri Via {
42                         get { return via; }
43                 }
44                 
45                 public virtual IAsyncResult BeginSend (Message message, AsyncCallback callback, object state)
46                 {
47                         return BeginSend (message, this.DefaultSendTimeout, callback, state);
48                 }
49                 
50                 public abstract IAsyncResult BeginSend (Message message, TimeSpan timeout, AsyncCallback callback, object state);
51                 
52                 public abstract void EndSend (IAsyncResult result);
53                 
54                 public virtual void Send (Message message)
55                 {
56                         Send (message, this.DefaultSendTimeout);
57                 }
58
59                 public virtual void Send (Message message, TimeSpan timeout)
60                 {
61                         EndSend (BeginSend (message, timeout, null, null));
62                 }
63
64                 public virtual IAsyncResult BeginReceive (AsyncCallback callback, object state)
65                 {
66                         return BeginReceive (this.DefaultReceiveTimeout, callback, state);
67                 }
68
69                 public abstract IAsyncResult BeginReceive (TimeSpan timeout, AsyncCallback callback, object state);
70                 
71                 public abstract IAsyncResult BeginTryReceive (TimeSpan timeout, AsyncCallback callback, object state);
72                 
73                 public abstract IAsyncResult BeginWaitForMessage (TimeSpan timeout, AsyncCallback callback, object state);
74                 
75                 public abstract Message EndReceive (IAsyncResult result);
76                 
77                 public abstract bool EndTryReceive (IAsyncResult result, out Message message);
78                 
79                 public abstract bool EndWaitForMessage (IAsyncResult result);
80                 
81                 public virtual Message Receive ()
82                 {
83                         return Receive (this.DefaultReceiveTimeout);
84                 }
85
86                 public virtual Message Receive (TimeSpan timeout)
87                 {
88                         return EndReceive (BeginReceive (timeout, null, null));
89                 }
90                 
91                 public virtual bool TryReceive (TimeSpan timeout, out Message message)
92                 {
93                         return EndTryReceive (BeginTryReceive (timeout, null, null), out message);
94                 }
95
96                 public virtual bool WaitForMessage (TimeSpan timeout)
97                 {
98                         return EndWaitForMessage (BeginWaitForMessage (timeout, null, null));
99                 }
100         }
101 }